题目链接:http://poj.org/problem?id=1751
Sample Input 9 1 5 0 0 3 2 4 5 5 1 0 4 5 2 1 2 5 3 3 1 3 9 7 1 2 Sample Output 1 6 3 7 4 9 5 7 8 3
分析:某个地方政府想修建一些高速公路使他们每个乡镇都可以相同通达,不过以前已经修建过一些公路,现在要实现所有的联通,所花费的最小代价是多少?(也就是最小的修建长度),输出的是需要修的路,不过如果不需要修建就什么都不输出。
一般的最小生成树,注意控制下标,输出来就好了
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<algorithm> 5 #include<iostream> 6 #include<queue> 7 #include<stdlib.h> 8 using namespace std; 9 10 #define N 12000 11 #define INF 0x3f3f3f3f 12 13 double maps[N][N],dist[N],c[N]; 14 int n,vis[N],v=0; 15 16 struct node 17 { 18 int x,y; 19 } p[N],q[N]; 20 21 void Init() 22 { 23 for(int i=1; i<=n; i++) 24 for(int j=1; j<=n; j++) 25 maps[i][j]=(i==j)?0:INF; 26 } 27 28 double Len(node a,node b) 29 { 30 int x=b.x-a.x; 31 int y=b.y-a.y; 32 double len=(double)sqrt(x*x+y*y); 33 return len; 34 } 35 36 void Prim(int s) 37 { 38 vis[s]=1; 39 40 for(int i=1; i<=n; i++) 41 { 42 dist[i]=maps[s][i]; 43 q[i].x=s,q[i].y=i; 44 } 45 46 47 for(int i=1; i<n; i++) 48 { 49 double Min=INF; 50 int index=-1; 51 for(int j=1; j<=n; j++) 52 { 53 if(!vis[j]&&Min>dist[j]) 54 { 55 Min=dist[j]; 56 index=j; 57 } 58 } 59 if(Min !=0) 60 printf("%d %d\n", q[index].x,q[index].y); 61 62 vis[index]=1; 63 64 for(int j=1; j<=n; j++) 65 if(!vis[j]&&dist[j]>maps[index][j]) 66 { 67 dist[j]=maps[index][j]; 68 q[j].x=index,q[j].y=j; 69 } 70 } 71 } 72 73 int main() 74 { 75 int i,j,m,a,b; 76 77 scanf("%d", &n); 78 Init(); 79 80 for(i=1; i<=n; i++) 81 scanf("%d%d", &p[i].x,&p[i].y); 82 83 for(i=1; i<n; i++) 84 for(j=i+1; j<=n; j++) 85 maps[i][j]=maps[j][i]=Len(p[i],p[j]); 86 87 88 scanf("%d", &m); 89 90 for(i=1; i<=m; i++) 91 { 92 scanf("%d%d", &a,&b); 93 maps[a][b]=maps[b][a]=0; 94 } 95 96 Prim(1); 97 98 return 0; 99 }