标签:des style blog http io color ar os 使用
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
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
【题意】
秦国有n个城市构成,每个城市都有一定的人口。现在要修路,要求最终修成的路花费最少代价使得所有的城市都连通。然后修路的时候可以使用一个魔法,免去一条路的费用,最终结果要使使用了魔法的那条路两端的城市总人口数除以剩下所有路的长度最大。
1 /* *********************************************** 2 MYID : Chen Fan 3 LANG : G++ 4 PROG : 4081 5 ************************************************ */ 6 7 #include <iostream> 8 #include <cstdio> 9 #include <cstring> 10 #include <algorithm> 11 #include <queue> 12 #include <cmath> 13 #include <bitset> 14 15 using namespace std; 16 17 typedef struct pnod 18 { 19 int x,y,p; 20 } pnode; 21 pnode p[1010]; 22 23 typedef struct nod 24 { 25 int a,b; 26 double c; 27 friend bool operator < (nod a,nod b) 28 { 29 return a.c>b.c; 30 } 31 } node; 32 33 node edge[1000010]; 34 int start[1010],num[1010]; 35 36 bool op(node a,node b) 37 { 38 if (a.a==b.a) return a.c<b.c; 39 else return a.a<b.a; 40 } 41 42 node ntoh(int a,int b,double c) 43 { 44 node x; 45 x.a=a; 46 x.b=b; 47 x.c=c; 48 return x; 49 } 50 51 double maxx[1010][1010]; 52 bitset<1010> inway[1010]; 53 54 double prim(int s,int n) 55 { 56 /**/ 57 int list[1010],listail=1; 58 list[1]=s; 59 /**/ 60 priority_queue<node> heap; 61 while (!heap.empty()) heap.pop(); 62 bitset<1010> flag; 63 flag.reset(); 64 flag[s]=1; 65 double ans=0; 66 memset(maxx,0,sizeof(maxx)); 67 for (int i=0;i<num[s];i++) heap.push(edge[start[s]+i]); 68 69 for (int i=1;i<n;i++) 70 { 71 node now=heap.top(); 72 heap.pop(); 73 while (flag[now.b]) 74 { 75 now=heap.top(); 76 heap.pop(); 77 } 78 /**/ 79 for (int j=1;j<=listail;j++) 80 { 81 maxx[list[j]][now.b]=max(maxx[list[j]][now.a],now.c); 82 maxx[now.b][list[j]]=maxx[list[j]][now.b]; 83 } 84 listail++; 85 list[listail]=now.b; 86 /**/ 87 flag[now.b]=true; 88 ans+=now.c; 89 for (int j=0;j<num[now.b];j++) 90 if (!flag[edge[start[now.b]+j].b]) heap.push(edge[start[now.b]+j]); 91 } 92 93 return ans; 94 } 95 96 double getdis(int x,int y) 97 { 98 return sqrt((p[x].x-p[y].x)*(p[x].x-p[y].x)+(p[x].y-p[y].y)*(p[x].y-p[y].y)); 99 } 100 101 int main() 102 { 103 freopen("4081.txt","r",stdin); 104 105 int t; 106 scanf("%d",&t); 107 for (int tt=1;tt<=t;tt++) 108 { 109 int n; 110 scanf("%d",&n); 111 for (int i=1;i<=n;i++) scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].p); 112 113 int m=0; 114 for (int i=1;i<=n;i++) 115 { 116 start[i]=m+1; 117 num[i]=n-1; 118 for (int j=1;j<=n;j++) 119 if (i!=j) 120 { 121 m++; 122 edge[m].a=i; 123 edge[m].b=j; 124 edge[m].c=getdis(i,j); 125 } 126 } 127 128 double sum=prim(1,n); 129 130 double ma=0; 131 for (int i=1;i<=m;i++) 132 { 133 double temp=(p[edge[i].a].p+p[edge[i].b].p)/(sum-maxx[edge[i].a][edge[i].b]); 134 if (ma<temp) ma=temp; 135 } 136 137 printf("%.2f\n",ma); 138 } 139 140 return 0; 141 }
HDU 4081 Qin Shi Huang's National Road System 次小生成树变种
标签:des style blog http io color ar os 使用
原文地址:http://www.cnblogs.com/jcf94/p/4073961.html