1813:还是畅通工程

时间限制:1 秒

内存限制:32 兆

特殊判题: 否

提交:94

解决: 43

标签

  • 最小生成树

题目描述

某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。

输入格式

测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
        当N为0时,输入结束,该用例不被处理。

输出

对每个测试用例,在1行里输出最小的公路总长度。

样例输入

8
1 2 42
1 3 68
1 4 35
1 5 1
1 6 70
1 7 25
1 8 79
2 3 59
2 4 63
2 5 65
2 6 6
2 7 46
2 8 82
3 4 28
3 5 62
3 6 92
3 7 96
3 8 43
4 5 28
4 6 37
4 7 92
4 8 5
5 6 3
5 7 54
5 8 93
6 7 83
6 8 22
7 8 17
0

样例输出

82

稠密图,prim算法:

 1 #include <stdio.h>
 2 #define INF 500000
 3 typedef struct
 4 {
 5     int eage[101][101];
 6
 7 }GRAPH;
 8 GRAPH g;
 9 int main(Void)
10 {
11     //freopen("in.txt","r",stdin);
12     int n;
13     while(scanf("%d",&n)!=EOF&&n!=0)
14     {
15         int e;
16         e=n*(n-1)/2;
17         int i;
18         int a,b,w;
19         for(i=0;i<n;i++)
20         {
21             int j;
22             for(j=1;j<=n;j++)
23                 g.eage[i][j]=INF;
24         }
25         for(i=1;i<=e;i++)
26         {
27             scanf("%d %d %d",&a,&b,&w);
28             g.eage[a][b]=w;
29             g.eage[b][a]=w;
30
31         }
32         int lowcost[5000];
33         int vset[5000];
34         for(i=1;i<=n;i++)
35         {
36             lowcost[i]=g.eage[1][i];
37
38             vset[i]=0;
39         }
40         vset[1]=1;
41         int sum=0;
42         int u;
43
44
45         for(i=1;i<n;i++)//已经排除掉初始点,还剩下n-1次选择
46         {
47             int min=INF;
48             int j;
49             for(j=1;j<=n;j++)
50             {
51                 if(vset[j]==0&&lowcost[j]<min)
52                 {
53                     min=lowcost[j];
54                     u=j;
55                 }
56
57             }
58
59             vset[u]=1;
60             sum+=min;
61             int k;
62             for(k=1;k<=n;++k)
63             {
64                 if(vset[k]==0&&g.eage[u][k]<lowcost[k])
65                     lowcost[k]=g.eage[u][k];
66             }
67         }
68         printf("%d\n",sum);
69     }
70     return 0;
71
72 }

Kruskal算法:

 1 #include <stdio.h>
 2 typedef struct
 3 {
 4     int a;
 5     int b;
 6     int w;
 7 }ROAD;
 8 ROAD road[5000];
 9 int v[5000];
10 int getroot(int m)
11 {
12
13     while(m!=v[m])
14         m=v[m];
15     return m;
16 }
17 int main(void)
18 {
19     //freopen("in.txt","r",stdin);
20     int n;
21     int e;
22     while(scanf("%d",&n)!=EOF&&n!=0)
23     {
24         int sum=0;
25         e=n*(n-1)/2;
26         int i;
27         for(i=0;i<e;i++)
28         {
29             scanf("%d %d %d",&road[i].a,&road[i].b,&road[i].w);
30             //printf("%d %d %d\n",road[i].a,road[i].b,road[i].w);
31         }
32         for(i=1;i<=n;i++)
33             v[i]=i;
34         for(i=e-1;i>0;i--)
35         {
36             int j;
37             ROAD tmp;
38             for(j=0;j<i;j++)
39                 if(road[j].w>road[j+1].w)
40                     {
41                         tmp=road[j];
42                         road[j]=road[j+1];
43                         road[j+1]=tmp;
44
45                     }
46         }
47         for(i=0;i<e;i++)
48         {
49             int a,b;
50             a=getroot(road[i].a);
51             b=getroot(road[i].b);
52             if(a!=b)
53             {
54                 v[a]=b;
55                 sum+=road[i].w;
56             }
57         }
58         printf("%d\n",sum);
59     }
60     return 0;
61 }

prim耗时少很多

时间: 2024-10-17 02:38:21

1813:还是畅通工程的相关文章

HDU - 1232 畅通工程

畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? Input测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M:随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号.为简单起见,城镇从1到N编号. 注意

HDU1863 畅通工程---(最小生成树)

畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27972    Accepted Submission(s): 12279 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出

HDU 1389 继续畅通工程【最小生成树,Prime算法+Kruskal算法】

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21871    Accepted Submission(s): 9356 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列

HDU——1874畅通工程续(邻接矩阵弗洛伊德)

畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 41849    Accepted Submission(s): 15463 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走

hdu 1875 畅通工程再续(kruskal算法计算最小生成树)

畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18411    Accepted Submission(s): 5769 Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先

杭电1233还是畅通工程

还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 25177    Accepted Submission(s): 11174 Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路

最小生成树(MST) prime() 算法 kruskal()算法 A - 还是畅通工程

某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离. 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小.请计算最小的公路总长度. Input 测试输入包含若干测试用例. 每个测试用例的第1行给出村庄数目N ( < 100 ):随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离.为简单起见,村庄从1到N编号. 当N为0

题目1017:还是畅通工程(最小生成树初步应用)

题目链接:http://ac.jobdu.com/problem.php?pid=1017 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: // // 1017 还是畅通工程.cpp // Jobdu // // Created by PengFei_Zheng on 18/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <std

HDU 1874 畅通工程续 最短路

畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多组数据,请处理到文