HDUOJ-1936 畅通工程 【并查集+最小生成树】
来源:互联网 发布:办公软件培训视频 编辑:程序博客网 时间:2024/05/16 18:06
畅通工程
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 25921 Accepted Submission(s): 11297
Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
Sample Input
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
Sample Output
3
?
- 题意:给你n个村庄,m条道路信息,问是否可以所有村庄连通,若能连通最小花费多少;
- 思路:n个点如果要连通最少要n-1条边,即符合树的结构,可以用并查集判断是否能使所有的点连通,如果能连通就用prime或者kruskal求出构造最小生成树;
- 失误:注意对比prime和dijkstra的异同;
- 代码如下:
#include<cstdio>#include<cstring>using namespace std;#define inf 0x3f3f3f3fconst int MAXN=1e3+10;int map[MAXN][MAXN],dis[MAXN],fa[MAXN];bool vis[MAXN];int ans;int findroot(int x){ int r=x; while(r!=fa[r]) r=fa[r]; while(x!=fa[x]) { int tem=fa[x]; fa[x]=r; x=tem; } return r;}void Union(int x,int y){ int fx=findroot(x); int fy=findroot(y); if(fx!=fy) { fa[fx]=fy; }}void prime(int n)//prime分三步 { memset(dis,inf,sizeof(dis)); memset(vis,false,sizeof(vis)); ans=0; dis[1]=0;//初始化 任选一点开始 for(int i=1;i<=n;++i) { int top=inf,k; for(int j=1;j<=n;++j)//1.找到一个最近点 记录 { if(!vis[j]&&dis[j]<top) { top=dis[j]; k=j; } } vis[k]=true; ans+=top;//2.将此点加入集合 更新答案 for(int j=1;j<=n;++j)//3.以此点为原点更新与之相邻接的点的距离 { if(!vis[j]&&map[k][j]<dis[j]) { dis[j]=map[k][j]; } } }}int main(){ int n,i,m,u,v,w; while(~scanf("%d",&n),n) { scanf("%d",&m); memset(map,inf,sizeof(map)); for(i=1;i<=m;++i) fa[i]=i; for(i=1;i<=n;++i) { scanf("%d %d %d",&u,&v,&w); map[u][v]=map[v][u]=w; Union(u,v); } bool flag=false; for(i=2;i<=m;++i) { if(findroot(i)!=findroot(1))//不一定全都被压缩 { flag=true; } } if(flag) printf("?\n"); else { prime(m); printf("%d\n",ans); } } return 0;}
0 0
- HDUOJ-1936 畅通工程 【并查集+最小生成树】
- HDU1233--还是畅通工程--最小生成树--并查集
- 畅通工程_hdu_1863(并查集+最小生成树).java
- 畅通工程(并查集,最小生成树)
- hdu 1232 畅通工程 并查集 最小生成树
- 还是畅通工程(并查集+最小生成树)
- hdu1879 继续畅通工程(最小生成树、 并查集)
- hdu1863 畅通工程 并查集+最小生成树
- hdu 1863 畅通工程 (并查集+最小生成树)
- HDU1863畅通工程---并查集+最小生成树
- 畅通工程(最小生成树&并查集)
- 还是畅通工程(最小生成树&&并查集)
- 还是畅通工程--最小生成树+并查集
- HDUoj 1232 畅通工程 (并查集
- HDUOJ 1232 畅通工程(并查集)
- 7-11 畅通工程之局部最小花费问题(最小生成树+并查集)
- HDUOJ 1233 还是畅通工程(最小生成树基础)
- HDUOJ-1879(继续畅通工程)(最小生成树)
- 动态规划经典5题
- Python黑帽编程2.2 数值类型
- Java异常处理
- 杭电1233
- CodeForces 687C The Values You Can Make
- HDUOJ-1936 畅通工程 【并查集+最小生成树】
- OpenJudge 简单的整数划分
- [note] deep learning tensorflow lecture 2 notes 深度学习笔记 (2) 解决过拟合
- 委托模式
- 生活的常识与智慧
- Interface Iterator<E>
- 机器学习中的范数规则化之L0、L1与L2范数
- 使用sklearn进行集成学习(一)
- 数据结构实验之串二:字符串匹配