HDU1863(Kruskal+并查集水题)

https://cn.vjudge.net/problem/HDU-1863

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

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
?
 1 #include<bits/stdc++.h>
 2 #define maxn 110
 3 using namespace std;
 4 int n,m,tot;
 5 int parent[maxn];
 6 int ans;
 7 struct edge
 8 {
 9     int u,v,w;
10 }EV[5050];
11 bool cmp(edge a,edge b)
12 {
13     return a.w<b.w;
14 }
15 int Find(int x)
16 {
17     if(parent[x]==-1)
18         return x;
19     else
20         return Find(parent[x]);
21 }
22 void kruskal()
23 {
24     memset(parent,-1,sizeof parent);
25     sort(EV+1,EV+m+1,cmp);
26     for(int i=1;i<=m;i++)
27     {
28         int t1=Find(EV[i].u);
29         int t2=Find(EV[i].v);
30         if(t1!=t2)
31         {
32             ans+=EV[i].w;
33             parent[t1]=t2;
34             tot++;
35         }
36     }
37 }
38 int main()
39 {
40     while(~scanf("%d%d",&m,&n)&&m)
41     {
42     for(int i=1;i<=m;i++)
43         cin>>EV[i].u>>EV[i].v>>EV[i].w;
44     ans=0;
45     tot=0;
46     kruskal();
47     if(tot!=n-1)
48         cout<<"?"<<endl;
49     else
50         cout<<ans<<endl;
51     }
52     return 0;
53 }


原文地址:https://www.cnblogs.com/zuiaimiusi/p/10727283.html

时间: 2024-11-08 21:45:50

HDU1863(Kruskal+并查集水题)的相关文章

G - Brain Network (easy)(并查集水题)

G - Brain Network (easy) Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u CodeForces 690C1 Description One particularly well-known fact about zombies is that they move and think terribly slowly. While we still don't know

POJ2236 wireless network 【并查集水题】

前端开发whqet,csdn,王海庆,whqet,前端开发专家 今天是个好日子,2014年5月20日,表白的最佳时机,虽说孩子已经四岁.结婚已经五年,但是也不可以偷懒,于是有了这个效果. 在线研究点这里,下载收藏点这里.程序猿and程序媛,大胆秀出你的爱吧. 利用html5 canvas实现动态的文字粒子效果,效果如下. OK,简单看看原理,首先我们需要在canvas里面实现描边文字,然后利用getImageData获得描边文字的像素矩阵,将粒子效果绑定在描边文章上. 整个效果如下. html文

并查集水题 POJ 1611

题意:有n(n<=30000)个学生,每个学生属于一个团体(可以属于多个团体),共有m(<=500)个团体,如果一个学生是嫌疑人,则他所在的团体的所有人都是嫌疑人,初始时0号学生是嫌疑人.问总共有多少个嫌疑人. 很明显同一个团体的学生可以连一条边,即求0号点所在的连通块有多少个点,用并查集可以很方便的办到,如果两个点属于同一个连通块则把他们的代表元连接起来即可,始终把较小的那个节点作为父节点,所以最后p[0]的节点数就是答案. 代码:

并查集水题 POJ2524

题意:一所学校有有n个学生,询问m对学生的宗教是否相同,求出这所学校最多有多少种宗教. 把宗教相同的学生连一条边,则未询问的学生默认他们没有边,最后连通块的个数就是宗教最多有多少个,并查集实现,把每个节点的最终父节点存到数组里,数组里不同元素的个数即为连通块的个数. 代码:

poj2524(并查集水题)

题目链接:http://poj.org/problem?id=2524 题目大意:学校共有n个同学,告诉你m对同学信仰同一宗教,问这个学校学生信仰宗教的数目最多为多少. 例: Sample Input 10 91 21 31 41 51 61 71 81 91 1010 42 34 54 85 80 0 Sample Output Case 1: 1Case 2: 7 解题思路:直接套并查集的板子就可以了,初始化n个集合默认他们都信任不一样的宗教,初始就用n个宗教,每次给你的两个同学那个号码将他

POJ2524并查集水题

Description There are so many different religions in the world today that it is difficult to keep track of them all. You are interested in finding out how many different religions students in your university believe in. You know that there are n stud

hdu 4496 并查集 反向并查集 水题 D-City

觉得这道题以后可以和优先队列结合起来 嗯 就是说依次去掉前n条路求连通块数量 处理的时候  只要每次merge发现父亲不相等 然后进到里面合并的时候 num-- wa了好几次是因为最后输出的时候开了点的数量大小的数组而不是操作数量数组 orz D-City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 5334    Accepted

【HDU1232】畅通工程(并查集基础题)

裸敲并查集,很水一次AC 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cctype> 6 #include <cmath> 7 #include <algorithm> 8 #include <numeric> 9 #include <string> 1

并查集刷题整理

并查集刷题整理 并查集是一种数据结构,然而用于维护其的数组及函数又极少,用途极为广泛,被广泛地应用于极多的综合题目, 比较经典的应用就是最小生成树\(kruskal\)算法 T1:Watering Hole G 题意 \(n\)个牧场,需要挖井,在第\(i\)号农场挖需要\(W_i\)元,在\(i\)与\(j\)号之间通水需要\(P_{i,j}=P_{j,i}\)元,问最小花费. 思路: 显然这并不是最短路问题,是最小生成树问题,目的就是将所有农场通过花费最小的路径进行串通 对于"挖井"