HDU 1102 Constructing Roads

提议很简单,就是N个村庄,每个村庄连起来需要一定的费用(以两个村庄的距离作为费用)。有M条路已经是相连的(不需要建路连接),问最少的费用,使它们都相连。

最小生成树,prim解决,附上代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<stdio.h>
 4 #define MAX 101
 5 #define MAXINT 1000001
 6 using namespace std;
 7 int map[MAX][MAX],dis[MAX],m,n,luxian;
 8 bool visit[MAX];
 9 void prim()
10 {
11     memset(visit,false,sizeof(visit));
12     int i,j,MIN,k;luxian=0;
13     for(i=1;i<=n;i++) dis[i]=map[1][i];
14     visit[1]=true;
15     for(i=1;i<n;i++){
16         MIN=MAXINT;
17         for(j=2;j<=n;j++)
18             if(!visit[j] && dis[j]<MIN){
19                 MIN=dis[j];
20                 k=j;
21             }
22         visit[k]=true;
23         luxian+=MIN;
24         for(j=2;j<=n;j++)
25             if(!visit[j] && map[k][j]<dis[j]){
26                 dis[j]=map[k][j];
27             }
28     }
29 }
30 int main()
31 {
32     int i,j,x,y;
33     while(scanf("%d",&n)!=EOF){
34         for(i=1;i<=n;i++)
35             for(j=1;j<=n;j++)
36                 scanf("%d",&map[i][j]);
37         scanf("%d",&m);
38         for(i=1;i<=m;i++){
39             scanf("%d%d",&x,&y);
40             map[x][y]=map[y][x]=0;
41         }
42         prim();
43         printf("%d\n",luxian);
44     }
45 }
View Code

 

posted on 2014-02-28 20:37  静夜方赤  阅读(317)  评论(0编辑  收藏  举报

导航