hdu1863 畅通工程2 还是用并查集思想解决最小生成树问题

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


New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院
关于2015年杭电ACM暑期集训队的选拔

畅通工程

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19994    Accepted Submission(s): 8528

Problem Description

省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。

Input

测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N 
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。

Output

对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。

Sample Input

3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100

Sample Output

3
?

Source

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

Recommend

lcy   |   We have carefully selected several similar problems for you:  1879 1875 1102 1301 1856

Statistic | Submit | Discuss | Note

Home | Top Hangzhou Dianzi University Online Judge 3.0
Copyright © 2005-2015 HDU ACM Team. All Rights Reserved.
Designer & DeveloperWang Rongtao LinLe GaoJie GanLu
Total 0.003000(s) query 5, Server time : 2015-05-24 09:53:34, Gzip enabled
Administration
 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdio>
 5 using namespace std;
 6 int u[5005],v[5005],w[5005];
 7 int p[105],r[5005];int n,m;
 8 int kruskal();
 9 int main()
10 {
11     //int i=0,j=0,k=0;
12
13     while(scanf("%d%d",&n,&m),n)
14     {
15         for(int i=1;i<=n;i++)
16         {
17             scanf("%d%d%d",&u[i],&v[i],&w[i]);
18         }
19         kruskal();
20     }return 0;
21 }22 int cmp(int i,int j){return w[i]<w[j];}
23 int find(int x){return p[x]==x?x:(p[x]=find(p[x]));}
24 int kruskal()
25 {int sum=0,cnt=0;
26     for(int i=1;i<=m;i++)p[i]=i;
27     for(int i=1;i<=n;i++)r[i]=i;
28     sort(r+1,r+n+1,cmp);
29     for(int i=1;i<=n;i++)
30     {
31         int e=r[i];
32         int x=find(u[e]);int y=find(v[e]);
33         if(x!=y)
34         {
35             sum++;
36             p[x]=y;
37             cnt+=w[e];
38         }
39     }
40     if(sum==m-1)//一定别忘了,只需要m-1条连接不同城市的路就行了
41     printf("%d\n",cnt);
42     else printf("?\n");
43     return 0;
44 }
时间: 2024-10-15 16:39:46

hdu1863 畅通工程2 还是用并查集思想解决最小生成树问题的相关文章

hdu-1863畅通工程 最小生成树克鲁斯卡尔算法kruskal(并查集实现)

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

HDU1863 - 畅通工程 Prim最小生成树算法

HDU1863 - 畅通工程:http://acm.hdu.edu.cn/showproblem.php?pid=1863 这题我中午用并查集的方法AC了一次,下午学了Prim.换个姿势,再来一次 = =! 并查集的方法:http://blog.csdn.net/p_rogrammer/article/details/47979073 代码: #include <iostream> #include <cstdio> #include <vector> #include

HDU1863 畅通工程 【最小生成树Prim】

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

DFS+并查集思想求被围绕的区域

class Solution { private int[][] dir= {{0,-1},{-1,0},{0,1},{1,0}}; private boolean[][] used; public boolean isMove(char[][] board,int x,int y) { if(x>=0&&x<board.length&&y>=0&&y<board[0].length) return true; return fals

hdu1863 畅通工程 并查集+最小生成树

Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现请你编写程序,计算出全省畅通需要的最低成本. Input 测试输入包含若干测试用例.每个测试用例的第1行给出评估的道路条数 N.村庄数目M ( < 100 ):随后的 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 - 1233 还是畅通工程(带权并查集和最小生成树)

题意:用路把各个村庄连起来,不一定要有直接的公路相连,只要能间接通过公路可达即可,给出每两个村庄之间的距离,求畅通需要的最少长度. 1.最小生成树 Kruskal 解法 先按长度从小到大排序,因为要求最短,那肯定要先把短的连起来,如果有一条边还没有连起来,并且这条边上的两个点在两个连通分量中,那就连接起来. 可以用第二组数据模拟一遍(排序后): 4 1 2 1 1 4 1 2 4 2 2 3 3 1 3 4 3 4 5 1 #include <cstdio> 2 #include <al

HDU1233——还是通常工程(最小生成树,并查集)

http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意:就是裸的最小生成树.这里用的是kruskal 使用的是并查集,将按距离排序的边,分别把点加到集合里.节点存在在集合里说明是环路. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,s,k; int par[10

CodeForces 828C String Reconstruction(并查集思想)

题意:给你n个串,给你每个串在总串中开始的每个位置,问你最小字典序总串. 思路:显然这道题有很多重复填涂的地方,那么这里的时间花费就会特别高. 我们维护一个并查集fa,用fa[i]记录从第i位置开始第一个没填涂的位置,那每次都能跳过涂过的地方.每次填完当前格就去填find(fa[i + 1]). ps:一定要合并,不然超时. 代码: #include<stack> #include<vector> #include<queue> #include<set>