Description
Input
Output
Sample Input
2 4 1 1 20 1 2 30 200 2 80 200 1 100 3 1 1 20 1 2 30 2 2 40
Sample Output
65.00 70.00
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<queue> #include<algorithm> #define FOR(i,a,b) for(int i=a;i<=b;++i) #define clr(f,z) memset(f,z,sizeof(f)) using namespace std; const int mp=1009; const double oo=1e18; class Edge { public: int v,next;double w; }; class _point { public:double x,y;int w; double get_dis(_point t) { return sqrt((x-t.x)*(x-t.x)+(y-t.y)*(y-t.y)); } }p[mp]; class MST_tree { public: int head[mp],edge; double edge_max[mp][mp],dis[mp]; Edge e[mp*mp*2]; int n; bool vis[mp]; int pre[mp];///x's father void clear() { clr(head,-1);edge=0; } void add(int u,int v,double w) { e[edge].v=v;e[edge].w=w;e[edge].next=head[u];head[u]=edge++; } double prim() { FOR(i,0,n)dis[i]=oo,vis[i]=0; FOR(i,0,n)FOR(j,0,n)edge_max[i][j]=0; int v; for(int i=head[1];~i;i=e[i].next) { v=e[i].v; dis[v]=min(dis[v],e[i].w); } int best;double MAX; double MST=0; vis[1]=1;dis[1]=0; FOR(i,0,n)pre[i]=1; FOR(i,2,n) { best=-1;MAX=oo; FOR(j,1,n) if(!vis[j]&&dis[j]<MAX) MAX=dis[j],best=j; vis[best]=1;MST+=MAX; for(int j=head[best];~j;j=e[j].next)///get max_tree_edge { v=e[j].v; if(vis[v])///visted { if(edge_max[v][ pre[best] ]<dis[best]) { edge_max[v][ best ]=edge_max[ best ][v]=dis[best]; } else { edge_max[v][ best ]=edge_max[ best ][v]=edge_max[ v ][ pre[best] ]; } } } for(int j=head[best];~j;j=e[j].next) { v=e[j].v; if(vis[v])continue; if(dis[v]>e[j].w) {dis[v]=e[j].w; pre[v]=best; } } } return MST; } void get_ans() { int v; double MST=prim(); double ans=0,A; for(int i=1;i<=n;++i) for(int j=head[i];~j;j=e[j].next) { v=e[j].v; A=p[v].w+p[i].w; ans=max(ans,A/(MST-edge_max[i][v])); } //cout<<ans<<endl; printf("%.2lf\n",ans); } }sp; int main() { int cas; while(~scanf("%d",&cas)) { while(cas--) { int n; scanf("%d",&n);sp.n=n; sp.clear(); FOR(i,1,n) { scanf("%lf%lf%d",&p[i].x,&p[i].y,&p[i].w); } FOR(i,1,n)FOR(j,i+1,n) { double dis=p[i].get_dis(p[j]); // cout<<i<<" -> "<<j<<" "<<dis<<endl; sp.add(i,j,dis);sp.add(j,i,dis); } // cout<<sp.prim()<<endl; sp.get_ans(); } } }