d.m个村庄,n条路,计算出所有村庄畅通需要的最低成本。

s.最小生成树

c.Prim算法:cost[a][b]和cost[b][a]都得赋值。

  1. /*
  2. Prim算法
  3. Prim求MST
  4. 耗费矩阵cost[][],标号从0开始,0~n-1
  5. 返回最小生成树的权值,返回-1表示原图不连通
  6. */
  7. #include<iostream>
  8. #include<stdio.h>
  9. #include<string.h>
  10. using namespace std;
  11.  
  12. const int INF=0x3f3f3f3f;
  13. const int MAXN=;
  14. bool vis[MAXN];
  15. int lowc[MAXN];
  16. //点是 0 n-1
  17. int Prim(int cost[][MAXN],int n){
  18. int ans=;
  19. memset(vis,false,sizeof(vis));
  20. vis[]=true;
  21. for(int i=;i<n;i++)lowc[i]=cost[][i];
  22. for(int i=;i<n;i++){
  23. int minc=INF;
  24. int p=-;
  25. for(int j=;j<n;j++)
  26. if(!vis[j]&&minc>lowc[j]){
  27. minc=lowc[j];
  28. p=j;
  29. }
  30. if(minc==INF)return -;//原图不连通
  31. ans+=minc;
  32. vis[p]=true;
  33. for(int j=;j<n;j++)
  34. if(!vis[j]&&lowc[j]>cost[p][j])
  35. lowc[j]=cost[p][j];
  36. }
  37. return ans;
  38. }
  39.  
  40. int main(){
  41. int cost[MAXN][MAXN];
  42. int N,M;
  43. int u,v,w;
  44.  
  45. while(~scanf("%d",&N)){
  46. if(N==)break;
  47. scanf("%d",&M);
  48. for(int i=;i<MAXN;++i){
  49. for(int j=;j<MAXN;++j){
  50. cost[i][j]=INF;
  51. }
  52. }
  53.  
  54. for(int i=;i<N;++i){
  55. scanf("%d%d%d",&u,&v,&w);
  56. --u;--v;
  57. cost[u][v]=cost[v][u]=w;
  58. }
  59.  
  60. int ans=Prim(cost,M);
  61. if(ans==-)printf("?\n");
  62. else printf("%d\n",ans);
  63. }
  64. return ;
  65. }

c2.Kruskal算法:加入a->b或者b->a一条边即可。

  1. /*
  2. Kruskal算法
  3. Kruskal算法求MST
  4. */
  5. #include<iostream>
  6. #include<stdio.h>
  7. #include<string.h>
  8. #include<algorithm>
  9. using namespace std;
  10.  
  11. const int MAXN=;//最大点数
  12. const int MAXM=;//最大边数
  13. int F[MAXN];//并查集使用
  14. struct Edge{
  15. int u,v,w;
  16. }edge[MAXM];//存储边的信息,包括起点/终点/权值
  17. int tol;//边数,加边前赋值为0
  18. void addedge(int u,int v,int w){
  19. edge[tol].u=u;
  20. edge[tol].v=v;
  21. edge[tol++].w=w;
  22. }
  23. //排序函数,将边按照权值从小到大排序
  24. bool cmp(Edge a,Edge b){
  25. return a.w<b.w;
  26. }
  27. int find(int x){
  28. if(F[x]==-)return x;
  29. else return F[x]=find(F[x]);
  30. }
  31. //传入点数,返回最小生成树的权值,如果不连通返回-1
  32. int kruskal(int n){
  33. memset(F,-,sizeof(F));
  34. sort(edge,edge+tol,cmp);
  35. int cnt=;//计算加入的边数
  36. int ans=;
  37. for(int i=;i<tol;i++){
  38. int u=edge[i].u;
  39. int v=edge[i].v;
  40. int w=edge[i].w;
  41. int t1=find(u);
  42. int t2=find(v);
  43. if(t1!=t2){
  44. ans+=w;
  45. F[t1]=t2;
  46. cnt++;
  47. }
  48. if(cnt==n-)break;
  49. }
  50. if(cnt<n-)return -;//不连通
  51. else return ans;
  52. }
  53.  
  54. int main(){
  55. int N,M;
  56. int u,v,w;
  57.  
  58. while(~scanf("%d",&N)){
  59. if(N==)break;
  60. scanf("%d",&M);
  61. tol=;
  62.  
  63. for(int i=;i<N;++i){
  64. scanf("%d%d%d",&u,&v,&w);
  65. --u;--v;
  66. addedge(u,v,w);
  67. }
  68.  
  69. int ans=kruskal(M);
  70. if(ans==-)printf("?\n");
  71. else printf("%d\n",ans);
  72. }
  73. return ;
  74. }

HDU - 1863 畅通工程(最小生成树)的更多相关文章

  1. HDU 1863 畅通工程(最小生成树,prim)

    题意: 给出图的边和点数,要求最小生成树的代价,注:有些点之间是不可达的,也就是可能有多个连通图.比如4个点,2条边:1-2,3-4. 思路: 如果不能连通所有的点,就输出‘?’.之前以为每个点只要有 ...

  2. HDU 1863 畅通工程 最小生成树

    思路: 比较典型的最小生成树的题目了..在这里用求最小生成树的经典算法K(Kruskal)算法和P(Prim)算法.我的 K 算法用的是结构体来存图,P 算法用的是邻接矩阵来存图,K算法的复杂度是O( ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    M ...

  4. <hdu - 1863> 畅通工程 并查集和最小生成树问题

    本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863  Problem Description: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以 ...

  5. hdu 1863 - 畅通工程(MST)

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. 题解报告:hdu 1863 畅通工程

    Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可 ...

  7. HDU 1863 畅通工程

    畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  8. HDU 1863 畅通工程(Prim算法求解MST)

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

  9. HDU 1863 畅通工程 克鲁斯卡尔算法

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. HDU 1863 畅通工程(Kruskal)

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

随机推荐

  1. Jmeter接口测试实战-Cookies

    场景: 接口测试时常都需要登录,请求方式(post), 登录常用的方法有通过获取token, 获取session, 获取cookie, 等等. 这几种都有一个共同的特点, 有效期(expires). ...

  2. Charm Bracelet(01背包)

    Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fil ...

  3. 【HDOJ6324】Grab The Tree(博弈)

    题意: 思路: #include <stdio.h> #include <vector> #include <algorithm> #include <str ...

  4. SQL中distinct的用法(四种示例分析)

    在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只 用它来返回不重复记录的条数,而不是用它来返回不重记录的 ...

  5. SHELL脚本运行的几种方法以及区别

    #1 给脚本加上执行权限chmod u+x a.sh, 而后就可以直接用全路径来执行脚本了,比如当前文件夹下用./a.sh,如果如果脚本所在目录在PATH环境变量之中, 则直接用a.sh即可(这和运行 ...

  6. js的基础(平民理解的执行上下文/调用堆栈/内存栈/值类型/引用类型)

    与以前的切图比较,现在的前端开发对js的要求似乎越来越高,在开发中,我们不仅仅是要知道如何运用现有的框架(react/vue/ng), 而且我们对一些基础的知识的依赖越来越大. 现在我们就用平民的方法 ...

  7. WinCE5.0如何安装.NET3.5

    首先去微软官网下载.NET Compact Framework 3.5 Redistributable 点击下载 下载页面 一共有两种安装方式,我们先介绍常规的安装方式 1.设备连接到电脑,然后双击下 ...

  8. 学习swift从青铜到王者之Swift语言函数05

    1.定义一个函数以及调用 //一,定义一个无参无返回值函数 func fun1(){ print("this is first function") } fun1() 2.定义一个 ...

  9. C#编程语言及.NET 平台快速入门指南

    github: https://github.com/mfjiang e-mail: hamlet.jiang@live.com   ⼀.C#,CLR,IL,JIT概念 以及 .NET 家族 (⼀)基 ...

  10. influxDB系列(二)

    来源于我在一个influxDB的qq交流群中的提问, 然后有个人 提了一个问题---->触发了我的思考!! :) 哈哈 自己的每一次说出一个回答,都是一次新的思考,也都进行了一些查阅资料,思考, ...