题目链接

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

思路

最小生成树问题,使用Prime算法或者Kruskal算法解决。这题在hdoj1233的基础上增加了判断是否能形成最小生成树的要求。

代码

Prime算法:

  1. #include <algorithm>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5.  
  6. const int INF = 0x7fffffff;
  7. const int N = + ;
  8. int map[N][N];
  9. int dist[N];
  10. int n, m;
  11.  
  12. void prime()
  13. {
  14. int min_edge, min_node;
  15. for (int i = ; i <= m; i++)
  16. dist[i] = INF;
  17. int ans = ;
  18. int now = ;
  19. for (int i = ; i < m; i++)
  20. {
  21. dist[now] = -;
  22. min_edge = INF;
  23. for (int j = ; j <= m; j++)
  24. {
  25. if (j != now && dist[j] >= )
  26. {
  27. if (map[now][j] > )
  28. dist[j] = min(dist[j], map[now][j]);
  29. if (dist[j] < min_edge)
  30. {
  31. min_edge = dist[j]; //min_edge存储与当前结点相连的最短的边
  32. min_node = j;
  33. }
  34. }
  35. }
  36. if (min_edge == INF) //不能形成最小生成树
  37. {
  38. puts("?");
  39. return;
  40. }
  41. ans += min_edge;
  42. now = min_node;
  43. }
  44. printf("%d\n", ans);
  45. }
  46.  
  47. int main()
  48. {
  49. //freopen("hdoj1863.txt", "r", stdin);
  50. while (scanf("%d%d", &n, &m) == && n)
  51. {
  52. memset(map, , sizeof(map));
  53. int a, b, d;
  54. for (int i = ; i < n; i++)
  55. {
  56. scanf("%d%d%d", &a, &b, &d);
  57. map[a][b] = map[b][a] = d;
  58. }
  59. prime();
  60. }
  61. return ;
  62. }

Kruskal算法:

  1. #include <algorithm>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. struct Edge
  8. {
  9. int a, b, dist;
  10.  
  11. Edge() {}
  12. Edge(int a, int b, int d):a(a),b(b),dist(d){}
  13. bool operator < (Edge edge)
  14. {
  15. return dist < edge.dist;
  16. }
  17. };
  18.  
  19. const int N = + ;
  20. vector<Edge> v;
  21. int p[N];
  22. int n, m;
  23.  
  24. int find_root(int x)
  25. {
  26. if (p[x] == -)
  27. return x;
  28. else return find_root(p[x]);
  29. }
  30.  
  31. void kruskal()
  32. {
  33. memset(p, -, sizeof(p));
  34. sort(v.begin(), v.end()); //将边按边长从短到长排序
  35. int ans = ;
  36. for (int i = ; i < v.size(); i++)
  37. {
  38. int ra = find_root(v[i].a);
  39. int rb = find_root(v[i].b);
  40. if (ra != rb)
  41. {
  42. ans += v[i].dist;
  43. p[ra] = rb;
  44. }
  45. }
  46.  
  47. int cnt = ;
  48. for (int i = ; i <= m; i++)
  49. if (p[i] == -) cnt++;
  50. if (cnt > ) //连通分量个数多于1个,不能形成最小生成树
  51. {
  52. puts("?");
  53. return;
  54. }
  55. printf("%d\n", ans);
  56. }
  57.  
  58. int main()
  59. {
  60. //freopen("hdoj1863.txt", "r", stdin);
  61. while (scanf("%d%d", &n, &m) == && n)
  62. {
  63. v.clear();
  64. int a, b, d;
  65. for (int i = ; i < n; i++)
  66. {
  67. scanf("%d%d%d", &a, &b, &d);
  68. v.push_back(Edge(a, b, d));
  69. }
  70. kruskal();
  71. }
  72. return ;
  73. }

hdoj1863 畅通工程(Prime || Kruskal)的更多相关文章

  1. HDU 1233 还是畅通工程(Kruskal算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)   ...

  2. HDU 1875 畅通工程再续(kruskal)

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. HDU 1232 畅通工程(Kruskal)

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. 畅通工程(kruskal算法)

    个人心得:日了狗,WR了俩个小时才发现是少了个vector清理,我也是醉了,不过后面还是对这个有了更好得了解,一是我得算法,而是学长改进 后的算法,改进后得算法还要判断所有村庄是否在连在一起,其实我觉 ...

  5. 继续畅通工程(kruskal prim)

    kruskal算法   #include <cstdio > #include <algorithm> using namespace std; const int MaxSi ...

  6. HDU 畅通工程系列

    畅通工程系列都是比较裸的最小生成树问题,且是中文题目,不赘述了. 1.HDU 1863 畅通工程 题意:一个省有很多村庄,其中一些之间是可以建公路的,每条公路都需要不同的代价,问代价最小的情况下将所有 ...

  7. hdu1875 畅通工程再续 最小生成树并查集解决---kruskal

    http://acm.hdu.edu.cn/showproblem.php?pid=1875 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  8. HDU1875——畅通工程再续(最小生成树:Kruskal算法)

    畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...

  9. prime算法求最小生成树(畅通工程再续)

    连着做了四道畅通工程的题,其实都是一个套路,转化为可以求最小生成树的形式求最小生成树即可 这道题需要注意: 1:因为满足路的长度在10到1000之间才能建路,所以不满足条件的路径长度可以初始化为无穷 ...

随机推荐

  1. [IOI2011]Race

    2599: [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem ...

  2. 深入分析Parquet列式存储格式

    Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的版本是1.8.0. 列式存储 列式存 ...

  3. 【mybatis笔记】 resultType与resultMap的区别

    序言: 昨天做一个项目,看到很多刚开始用mybatis的同事对于resultType和resultMap的理解与使用含糊不清,这里我试图用最好理解的说法写一写,欢迎大家勘误. 两者异同: 相同点:re ...

  4. [php]php时间格式化

    1.将毫秒转化为时间格式 date("Y-m-d H:i:s",$millsec);

  5. Tju_Oj_2790Fireworks Show

    这个题主要在于时间复杂度的计算,N是10的6次方,C是10的2次方,OJ系统可接受的时间是10的7次方(室友说是无数先人测出来了┭┮﹏┭┮),所以如果普通遍历的话肯定会超时.而代码中是跳着走了,相当于 ...

  6. vue、入门

    入门vue v-on:click:chang   绑定事件点击 生面周期,整个vue的执行过程,他的应用执行了生面周期,也就是执行过程,这个执行过程如下图表,我们可以参考下图,也可以访问官方网址:ht ...

  7. Shell中三种引号的用法及区别

    Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中 ...

  8. 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 ...

  9. nginx_upstream_check_module-master对nginx的后端机器进行健康状态检查报403错误【转】

    在nginx.conf配置文件中 在server添加 location /nstatus { check_status; access_log off; #allow 192.168.2.11; #d ...

  10. 我看到的最棒的Twisted入门教程!

    http://www.douban.com/note/232204441/ http://www.cnblogs.com/sevenyuan/archive/2010/11/18/1880681.ht ...