继续畅通工程

                                                                            Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。

当N为0时输入结束。

Output
每个测试用例的输出占一行,输出全省畅通需要的最低成本。
Sample Input
3 1 2 1 0 1 3 2 0 2 3 4 0 3 1 2 1 0 1 3 2 0 2 3 4 1 3 1 2 1 0 1 3 2 1 2 3 4 1 0
Sample Output
3 1 0
题目分析:这个题和hdu 1233差不多,就是加了一个状态,因此我们可以先判断每条路的状态,如果是修好的,就让它们的成本是0;如果没修,就让成本给出的成本。这样问题的处理就和1233一样了。
Prim算法:
1、时间复杂度O(n^3):
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int map[100][100];
int s[100],vis[100];
int n,m;
int prim()
{int i,j,t,p,min,cnt,minpos;int ans=0;cnt=0;vis[1]=1;s[cnt++]=1;while(cnt<n){t=cnt;min=inf;for(i=0;i<t;i++){p=s[i];for(j=1;j<=n;j++){if(!vis[j]&&map[p][j]<min){min=map[p][j];minpos=j;}}}ans+=min;s[cnt++]=minpos;vis[minpos]=1;}return ans;
}
int main()
{int i,sum;while(~scanf("%d",&n)&&n){memset(vis,0,sizeof(vis));memset(map,inf,sizeof(map));int b,c,d,sta;m=n*(n-1)/2;for(i=0;i<m;i++){scanf("%d%d%d%d",&b,&c,&d,&sta);if(sta==0)map[b][c]=map[c][b]=d;elsemap[b][c]=map[c][b]=0;}sum=prim();printf("%d\n",sum);}return 0;
}

2、时间复杂度O(n^2)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int adj[100];
int vis[100];
int nearest[100];
int map[100][100];
int n,m;
int prim()
{int i,j,min;int ans=0;vis[1]=1;for(i=2;i<=n;i++){nearest[i]=map[1][i];adj[i]=1;}int cnt=n-1;while(cnt--){min=inf;j=1;for(i=1;i<=n;i++){if(!vis[i]&&nearest[i]<min){min=nearest[i];j=i;}}ans+=map[j][adj[j]];vis[j]=1;for(i=1;i<=n;i++){if(!vis[i]&&map[i][j]<nearest[i]){nearest[i]=map[i][j];adj[i]=j;}}}return ans;
}
int main()
{int i;while(~scanf("%d",&n)&&n){int b,c,d,sta;memset(vis,0,sizeof(vis));memset(map,inf,sizeof(map));m=n*(n-1)/2;for(i=0;i<m;i++){scanf("%d%d%d%d",&b,&c,&d,&sta);if(sta==0)map[b][c]=map[c][b]=d;elsemap[b][c]=map[c][b]=0;}int sum=prim();printf("%d\n",sum);}return 0;
}

Kruskal算法:

时间复杂度O(ElogE)E为边数。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct point
{int u;int v;int w;
}a[5000];
bool comp(point a1,point a2)
{return a1.w<a2.w;
}
int n,m,father[100],t,cnt;
int find(int x)
{if(father[x]!=x)father[x]=find(father[x]);return father[x];
}
void merge(int x,int y)
{int p=find(x);int q=find(y);if(p<q)father[q]=p;elsefather[p]=q;
}
void initial()
{for(int i=1;i<=n;i++)father[i]=i;
}
int Kruskal()
{int ans=0;sort(a,a+m,comp);for(int i=0;i<m;i++){int x=find(a[i].u);int y=find(a[i].v);if(x!=y){ans+=a[i].w;merge(x,y);}}return ans;
}
int main()
{int i,sum,b,c,d,sta;while(~scanf("%d",&n)&&n){initial();m=n*(n-1)/2;for(i=0,t=0;i<m;i++){scanf("%d%d%d%d",&b,&c,&d,&sta);a[i].u=b;a[i].v=c;if(sta==0)a[i].w=d;elsea[i].w=0;}sum=Kruskal();printf("%d\n",sum);}return 0;
}

hdu 1879 继续畅通工程 最小生成树相关推荐

  1. hdu 1879 继续畅通工程 (最小生成树)

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

  2. HDU 1879 继续畅通工程 最小生成树

    继续畅通工程 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description ...

  3. hdu 1879 继续通畅工程(最小生成树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1879 /************************************************* ...

  4. HDU - 1879 继续畅通工程 【最小生成树 - 升级】

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

  5. hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)

    还是畅通工程                                                                            Time Limit: 4000/2 ...

  6. hdu 1879 继续畅通工程

    最小生成树入门题,和纯粹的裸题有些区别,题目中有些道路已经存在,不需要建造,答案是求最后建造的总费用,不要把已经有的道路的权值算进去 //kruskal算法已有的边权植赋为0 //用SORT排序,用并 ...

  7. hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)...

    赤裸裸滴最小生成树(MST),刚学的玩意,用两种方法熟练一下.(都是greedy) Kruskal方法:先对边按照代价非递减排序,再不断添加边且不产生环路,当边数=点数-1结束.判断加入(v,w)是否 ...

  8. HDU 1233 还是畅通工程(最小生成树 Prim+Kruskal)

    原题地址 http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意:(最小生成树裸题)有N个村庄,给出村庄两两之间的距离,要求铺设公路,使得任何两个村庄间都可 ...

  9. 【HDU - 1863】 畅通工程(并查集+最小生成树)

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

最新文章

  1. 中文速读微生物组(宏基因组)前沿文献——这个可以有
  2. Java学习(16)--System 类/Date 类/ Calendar类
  3. How does a relational database work
  4. P5357 【模板】AC自动机(二次加强版) fail树
  5. ad17编辑界面怎么检查未连线_软件账务处理流程之——凭证审核与检查
  6. 五、PHP框架Laravel学习笔记——回退、当前路由、单行为
  7. 爬虫新宠requests_html 带你甄别2019虚假大学 #华为云·寻找黑马程序员#
  8. cheaklist 人机交互界面_10个人机交互系统及界面的设计方案
  9. 三星Galaxy S21系列通过认证:终究还是要学苹果“保护环境”?
  10. JAVA中的MDC类_CMake - 用/ MT而不是/ MD编译
  11. JS中字串转参数用的false/true
  12. python快速编辑入门答案_1.1、Python快速入门(0529)
  13. 公众号题库搜题对接(提供免费接口)
  14. Selenium 批量执行url(附完整代码)
  15. 《老路用得上的商学课》36-40学习笔记
  16. 国产化飞腾CPU主板安装统信专业版桌面OS,以及统信OS如何进root用户
  17. getline 两次回车 解决办法
  18. 电信流失客户特征分析及预测
  19. 杭电计算机考研复试经验帖
  20. 理论篇五: 如何设计游戏棋牌平台 - 服务端 - 棋牌设计 - 一切皆步骤

热门文章

  1. 26期20180703 正则 grep
  2. spring boot实现软删除
  3. java基础--java.util.Date类型小结
  4. 解决删除从表,主表存在外键的问题
  5. 开发随笔——NOT IN vs NOT EXISTS
  6. 实现JavaScript匿名透明递归
  7. 算了一挂,也不知准不准
  8. MacBook开机自动连接iPad好评
  9. C++静态全局变量问题
  10. 多线程中的队列不一定需要线程安全