1863 畅通工程-并查集最小生成树

题目链接

问题描述:

  

简单的最小生成树的题,将路径按cost从小到大排序,利用克鲁斯塔尔求最小生成树算法就行。

代码:

  

 1 #include<iostream>
 2 #include<queue>
 3 #include<algorithm>
 4
 5 using namespace std;
 6 struct  Road
 7 {
 8     int beg;
 9     int end;
10     int cost;
11     Road(int beg, int end, int cost)
12     {
13         this->beg = beg;
14         this->end = end;
15         this->cost = cost;
16     }
17     bool operator <(const Road& b) const
18     //必须要带const,使用STL,或者自己写compare函数
19     //优先级大的在队列的前面,所以重载的时候需要注意需要的形式
20     {
21         return (cost > b.cost);
22     }
23
24 };
25
26 int father[101];
27 int getfather(int a) //路径压缩
28 {
29     if(father[a] != a)
30     {
31             father[a] = getfather(father[a]);
32         return father[a];
33     }
34     else
35         return father[a];
36 }
37
38 priority_queue<Road> q;
39 //并查集
40
41 int num;
42 int vnum;
43
44 int main()
45 {
46     cin>>num>>vnum;
47     int scost = 0;
48     int  ok = 0;
49     Road a = {0,0,0};
50     while(num)
51     {
52         scost = 0;
53         for(int i=0; i<=vnum; i++)
54         {
55             father[i] = i;
56         }
57         for(int i=0; i<num; i++)
58         {
59             cin>>a.beg>>a.end>>a.cost;
60             q.push(a);
61         }
62         while(!q.empty())
63         {
64             a = q.top();
65             q.pop();
66             if(getfather(a.beg) != getfather(a.end))
67             {
68                 father[a.end] = father[a.beg];
69                 scost += a.cost;
70                 ok++;
71             }
72         }
73         if(ok == vnum-1)
74             cout<<scost<<endl;
75         else
76             cout<<"?"<<endl;
77         ok = 0;
78         cin>>num>>vnum;
79
80     }
81     return 0;
82 }

原文地址:https://www.cnblogs.com/Crossea/p/11746940.html

时间: 2024-10-15 06:19:18

1863 畅通工程-并查集最小生成树的相关文章

hdu 1863 畅通工程 (并查集+最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17593    Accepted Submission(s): 7417 Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交

ACM: 继续畅通工程-并查集-最小生成树-解题报告

继续畅通工程 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态.现请你编写程序,计算出全省畅通需要的最低成本. Input 测试输入包含若干测试用例

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

Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现请你编写程序,计算出全省畅通需要的最低成本. Input 测试输入包含若干测试用例.每个测试用例的第1行给出评估的道路条数 N.村庄数目M ( < 100 ):随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间

ACM: 还是畅通工程-并查集-最小生成树-解题报

还是畅通工程 Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小.请计算最小的公路总长度. Input 测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( <

hdu 1863 畅通工程 (并查集 、 kruskal)

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

HDU1232 畅通工程 并查集

这道题跟HDU 1213 How Many Tables 并查集非常接近,都是赤裸裸的并查集的题. 思路:假设还需要建n-1条路,每并一次就自减1. 参考代码: #include<stdio.h> int fa[1000]; int find(int u) { return fa[u]==u?u:fa[u]=find(fa[u]); } int main() { int i,n,m,u,v,x,y; scanf("%d%d",&n,&m); while (n

HDU 1232 畅通工程(并查集)

畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 30485    Accepted Submission(s): 16013 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有

&lt;hdu - 1863&gt; 畅通工程 并查集和最小生成树问题

本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863  Problem Description: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现请你编写程序,计算出全省畅通需要的最低成本.  Input: 测试输入包含若干测试用例.每个测试用例的第1行给出评估的道路条数 N.村庄数目M ( < 100

畅通工程(并查集模版题)

题意: 多组输入N,M,当N为0退出人输入,N是道路数目,M是村庄总数,随后N行,每行输入三个数两个村庄的编号,以及连接这两个村庄的费用.对每一组数据输出畅通工程的最低费用,如果不能畅通就输出“?”(不包括双引号) 这道题有两道链接: 一道是fjut的链接,另外一道是hdu的 http://www.fjutacm.com/Problem.jsp?pid=1214 http://acm.hdu.edu.cn/showproblem.php?pid=1863 思路:其实这道题就是一道排序+并查集题,