码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1751 Highways

时间:2016-05-02 23:05:00      阅读:438      评论:0      收藏:0      [点我收藏+]

标签:

题意:n个城市,然后把n个城市的坐标都给你,然后给你m条已经修好的道路,然后给出m个已经修好道路的城市a,b,

However, they want to guarantee that every town is highway-reachable from every other town.

他们保证任何城市都是可以通过其他城市到达的

很明显是个最小生成树问题、

最后让你输出所有需要另外加的道路连接的两个城市a b、

思路:先对所有n个城市求一遍距离、然后对已经修好道路的城市赋值为0、输出的时候要使用一下前驱数组(用来记录一个点的前驱是哪一个点)

 

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int qq=800;
 7 const int MAX=1e8;
 8 int n,m,sum;
 9 int map[qq][qq];
10 int cost[qq+300];
11 int vis[qq];
12 int pre[qq];
13 int x[qq],y[qq];
14 void prim()
15 {
16     memset(vis,0,sizeof(vis));
17     for(int i=1;i<=n;++i){
18         cost[i]=map[1][i];
19         pre[i]=1;            //初始化前驱、因为刚开始加的1,所以将每一个点的前驱设置为1 
20     }        
21     vis[1]=1;
22     int minx,k;
23     for(int i=1;i<=n;++i){
24         minx=MAX;
25         for(int j=1;j<=n;++j)
26             if(!vis[j] && cost[j]<minx)
27                 minx=cost[k=j];
28         if(map[pre[k]][k])    printf("%d %d\n",pre[k],k);    //当道路不存在时,输出前驱、 
29         vis[k]=1;
30         for(int j=1;j<=n;++j)
31             if(map[k][j]<cost[j]){
32                 cost[j]=map[k][j];
33                 pre[j]=k;        //更新前驱、 
34             }    
35     }
36 }
37 int main()
38 {
39     scanf("%d",&n);
40     int i,j,a,b;
41     for(i=1;i<=n;++i){
42         scanf("%d%d",&x[i],&y[i]);
43         for(j=1;j<i;++j){
44             if(i==j)    map[i][j]=MAX;
45             else        map[i][j]=map[j][i]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
46         }
47     }
48     scanf("%d",&m);
49     for(i=1;i<=m;++i){
50         scanf("%d%d",&a,&b);
51         map[a][b]=map[b][a]=0;
52     }
53     prim();    
54     return 0;
55 }

 

POJ 1751 Highways

标签:

原文地址:http://www.cnblogs.com/sasuke-/p/5453283.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!