hdoj1863 畅通工程(Prime || Kruskal)
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1863
思路
最小生成树问题,使用Prime算法或者Kruskal算法解决。这题在hdoj1233的基础上增加了判断是否能形成最小生成树的要求。
代码
Prime算法:
- #include <algorithm>
- #include <cstring>
- #include <cstdio>
- using namespace std;
- const int INF = 0x7fffffff;
- const int N = + ;
- int map[N][N];
- int dist[N];
- int n, m;
- void prime()
- {
- int min_edge, min_node;
- for (int i = ; i <= m; i++)
- dist[i] = INF;
- int ans = ;
- int now = ;
- for (int i = ; i < m; i++)
- {
- dist[now] = -;
- min_edge = INF;
- for (int j = ; j <= m; j++)
- {
- if (j != now && dist[j] >= )
- {
- if (map[now][j] > )
- dist[j] = min(dist[j], map[now][j]);
- if (dist[j] < min_edge)
- {
- min_edge = dist[j]; //min_edge存储与当前结点相连的最短的边
- min_node = j;
- }
- }
- }
- if (min_edge == INF) //不能形成最小生成树
- {
- puts("?");
- return;
- }
- ans += min_edge;
- now = min_node;
- }
- printf("%d\n", ans);
- }
- int main()
- {
- //freopen("hdoj1863.txt", "r", stdin);
- while (scanf("%d%d", &n, &m) == && n)
- {
- memset(map, , sizeof(map));
- int a, b, d;
- for (int i = ; i < n; i++)
- {
- scanf("%d%d%d", &a, &b, &d);
- map[a][b] = map[b][a] = d;
- }
- prime();
- }
- return ;
- }
Kruskal算法:
- #include <algorithm>
- #include <cstring>
- #include <cstdio>
- #include <vector>
- using namespace std;
- struct Edge
- {
- int a, b, dist;
- Edge() {}
- Edge(int a, int b, int d):a(a),b(b),dist(d){}
- bool operator < (Edge edge)
- {
- return dist < edge.dist;
- }
- };
- const int N = + ;
- vector<Edge> v;
- int p[N];
- int n, m;
- int find_root(int x)
- {
- if (p[x] == -)
- return x;
- else return find_root(p[x]);
- }
- void kruskal()
- {
- memset(p, -, sizeof(p));
- sort(v.begin(), v.end()); //将边按边长从短到长排序
- int ans = ;
- for (int i = ; i < v.size(); i++)
- {
- int ra = find_root(v[i].a);
- int rb = find_root(v[i].b);
- if (ra != rb)
- {
- ans += v[i].dist;
- p[ra] = rb;
- }
- }
- int cnt = ;
- for (int i = ; i <= m; i++)
- if (p[i] == -) cnt++;
- if (cnt > ) //连通分量个数多于1个,不能形成最小生成树
- {
- puts("?");
- return;
- }
- printf("%d\n", ans);
- }
- int main()
- {
- //freopen("hdoj1863.txt", "r", stdin);
- while (scanf("%d%d", &n, &m) == && n)
- {
- v.clear();
- int a, b, d;
- for (int i = ; i < n; i++)
- {
- scanf("%d%d%d", &a, &b, &d);
- v.push_back(Edge(a, b, d));
- }
- kruskal();
- }
- return ;
- }
hdoj1863 畅通工程(Prime || Kruskal)的更多相关文章
- HDU 1233 还是畅通工程(Kruskal算法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) ...
- HDU 1875 畅通工程再续(kruskal)
畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU 1232 畅通工程(Kruskal)
畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 畅通工程(kruskal算法)
个人心得:日了狗,WR了俩个小时才发现是少了个vector清理,我也是醉了,不过后面还是对这个有了更好得了解,一是我得算法,而是学长改进 后的算法,改进后得算法还要判断所有村庄是否在连在一起,其实我觉 ...
- 继续畅通工程(kruskal prim)
kruskal算法 #include <cstdio > #include <algorithm> using namespace std; const int MaxSi ...
- HDU 畅通工程系列
畅通工程系列都是比较裸的最小生成树问题,且是中文题目,不赘述了. 1.HDU 1863 畅通工程 题意:一个省有很多村庄,其中一些之间是可以建公路的,每条公路都需要不同的代价,问代价最小的情况下将所有 ...
- hdu1875 畅通工程再续 最小生成树并查集解决---kruskal
http://acm.hdu.edu.cn/showproblem.php?pid=1875 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...
- HDU1875——畅通工程再续(最小生成树:Kruskal算法)
畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...
- prime算法求最小生成树(畅通工程再续)
连着做了四道畅通工程的题,其实都是一个套路,转化为可以求最小生成树的形式求最小生成树即可 这道题需要注意: 1:因为满足路的长度在10到1000之间才能建路,所以不满足条件的路径长度可以初始化为无穷 ...
随机推荐
- [IOI2011]Race
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem ...
- 深入分析Parquet列式存储格式
Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的版本是1.8.0. 列式存储 列式存 ...
- 【mybatis笔记】 resultType与resultMap的区别
序言: 昨天做一个项目,看到很多刚开始用mybatis的同事对于resultType和resultMap的理解与使用含糊不清,这里我试图用最好理解的说法写一写,欢迎大家勘误. 两者异同: 相同点:re ...
- [php]php时间格式化
1.将毫秒转化为时间格式 date("Y-m-d H:i:s",$millsec);
- Tju_Oj_2790Fireworks Show
这个题主要在于时间复杂度的计算,N是10的6次方,C是10的2次方,OJ系统可接受的时间是10的7次方(室友说是无数先人测出来了┭┮﹏┭┮),所以如果普通遍历的话肯定会超时.而代码中是跳着走了,相当于 ...
- vue、入门
入门vue v-on:click:chang 绑定事件点击 生面周期,整个vue的执行过程,他的应用执行了生面周期,也就是执行过程,这个执行过程如下图表,我们可以参考下图,也可以访问官方网址:ht ...
- Shell中三种引号的用法及区别
Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中 ...
- aarch64_m1
MAKEDEV-3.24-18.fc26.aarch64.rpm 2017-02-14 08:46 99K fedora Mirroring Project MUMPS-5.0.2-8.fc26.aa ...
- nginx_upstream_check_module-master对nginx的后端机器进行健康状态检查报403错误【转】
在nginx.conf配置文件中 在server添加 location /nstatus { check_status; access_log off; #allow 192.168.2.11; #d ...
- 我看到的最棒的Twisted入门教程!
http://www.douban.com/note/232204441/ http://www.cnblogs.com/sevenyuan/archive/2010/11/18/1880681.ht ...