hdu 1233 还是畅通工程 kruskal最小生成树并查集实现

http://acm.hdu.edu.cn/showproblem.php?pid=1233


杭电ACM暑期集训队的选拔

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 30319    Accepted Submission(s): 13542

Problem Description

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

Input

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

Output

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

Sample Input

3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0

Sample Output

3
5

Hint

Hint

Huge input, scanf is recommended.

Source

浙大计算机研究生复试上机考试-2006年

Recommend

JGShining   |   We have carefully selected several similar problems for you:  1102 1875 1879 1301 1162 

 1 /*并查集实际上是解决最小生成树问题的一种方法,要掌握这种思想!!
 2 小白书(算法竞赛入门经典)第201页上有很好的解释)
 3
 4 */
 5 #include<iostream>
 6 #include<cstring>
 7 #include<cstdio>
 8 #include<algorithm>
 9 using namespace std;
10 int kruskal();
11 int u[5005],v[5005],w[5005];int n;
12 int p[200],r[5005];
13 int main()
14 {
15
16     while(scanf("%d",&n),n)
17     {
18         for(int i=1;i<=(n*(n-1))/2;i++)
19         {
20             scanf("%d %d %d",&u[i],&v[i],&w[i]);
21         }
22         printf("%d\n",kruskal());
23     }return 0;
24 }
25 int cmp(int i,int j){return w[i]<w[j];}
26 int find(int x){return p[x]==x?x:(p[x]=find(p[x]));}
27
28 int kruskal()
29 {
30     int ans=0;
31     for(int i=1;i<=n;i++)p[i]=i;//初始化并查集
32     for(int j=1;j<=(n*(n-1))/2;j++)r[j]=j;//初始化边序号
33     sort(r+1,r+(n*(n-1))/2+1,cmp);
34     for(int i=1;i<=(n*(n-1))/2;i++)
35     {int e=r[i];
36         int x=find(u[e]),y=find(v[e]);
37         if(x!=y){p[x]=y;ans+=w[e]; }
38
39     }
40     return ans;
41 }
时间: 2024-08-03 00:47:20

hdu 1233 还是畅通工程 kruskal最小生成树并查集实现的相关文章

HDU ACM : 1875 畅通工程再续-&gt;最小生成树(并查集)

解析:最小生成树:Kruskal 算法:并查集实现. 1.首先找出符合要求的边: 2.对找出的边排序: 3.并查集找出n-1条边,无法修通n-1条路则无法实现要求. #include<iostream> #include<cmath> #include<algorithm> using namespace std; struct Point { int x,y; } point[102]; struct Edge { int a,b; double v; bool op

hdu 1233 还是畅通工程 (最小生成树)

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

HDU 1233 还是畅通工程【最小生成树入门题,Kruskal算法+Prim算法】

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

HDU 1233 还是畅通工程【最小生成树】

解题思路:kruskal算法:贪心选取最短的边构成一棵最小的生成树 共n个点,即先将所有的边排序,然后利用并查集判断,如果两点连通,则不加入树,不连通,则加入树,直到加入了n-1条边,构成生成树. 反思:仔细edge的排序,wa了好多次因为这个 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 27773    Accept

HDU 1233 还是畅通工程 ( Kruskal或Prim)

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

poj1258 Agri-Net +hdu 1233 还是畅通工程 (最小生成树Prime算法)

Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43215   Accepted: 17683 Description Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He nee

HDU - 1233 还是畅通工程(最小生成树)

d.n个村庄,n*(n-1)/2条路,铺设若干条路,使任何两个村庄都可达.求最小的公路总长度. s.最小生成树 c.Prim算法:cost[a][b]和cost[b][a]都得赋值. /* Prim算法 Prim求MST 耗费矩阵cost[][],标号从0开始,0~n-1 返回最小生成树的权值,返回-1表示原图不连通 */ #include<iostream> #include<stdio.h> #include<string.h> using namespace st

HDU - 1233 - 还是畅通工程 (最小生成树!!)

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

HDU 1232 畅通工程(最小生成树+并查集)

畅通工程 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 59   Accepted Submission(s) : 37 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通