题目链接: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 }

 

posted on 2016-07-30 10:53  惟愿。。。  阅读(161)  评论(0编辑  收藏  举报