hdoj 1863 畅通工程
2015-08-11 10:51
316 查看
畅通工程
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 ?
解题思路:
这道题是一道简单的最小生成树的题,题目不难,多了一个判断树的个数,当树的个数大于一是输出问号,否则输出最低的成本。开始找到判断树个数的方法不对没有过,后来查资料找到了。原来方法挺简单的。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int pre[200]; int n,m,sum,cnt,i; struct node { int u,v,w; }; node edg[200]; int cmp(node a,node b) { return a.w<b.w; } void init() { for(i=1;i<=m;i++) pre[i]=i; } int find(int x) { int r=x; while(r!=pre[r]) r=pre[r]; return r; } bool join(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) { pre[fy]=fx; return true; } return false; } int main() { while(scanf("%d%d",&n,&m),n) { for(i=0;i<n;i++) scanf("%d%d%d",&edg[i].u,&edg[i].v,&edg[i].w); init(); sort(edg,edg+n,cmp); for(i=0,sum=0;i<n;i++) { if(join(edg[i].u,edg[i].v)) { sum+=edg[i].w; } } for(i=1,cnt=0;i<=m;i++) { if(i==pre[i]) cnt++; } if(cnt>1) printf("?\n"); else printf("%d\n",sum); } return 0; }
相关文章推荐
- request.setAttribute()、session.setAttribute()和request.getParameter()的联系与区别
- 算法竞赛入门经典: 第三章 数组和字符串 3.4竖式问题
- 21-IO流-17-IO流(字符流-缓冲区-自定义MyBufferedReader-readLine方法)
- APP搜索附近功能的一种解决方案-基于百度LBS云服务
- ZigBee路由协议分析(机制,算法,发现,建立)
- winform之自定义控件
- CodeForces 344A Magnets
- MySQL出现同步延迟如何解决?优化?
- apache的扩展模块安装
- hdu 2795(单点修改)
- 检测CPU利用率的Shell脚本
- Num 31 : HDOJ : 1863 畅通工程 [ kruskal( 克鲁斯卡尔 )算法 ] [ 最小生成树 ]
- X的追求道路 SDUT 3027
- hdoj 1863 畅通工程 【最小生成树】
- 21-IO流-15-IO流(字符流-缓冲区-复制文本文件)
- 21-IO流-16-IO流(字符流-缓冲区-自定义MyBufferedReader-read方法)
- 本地推送的使用方法
- 手机端开发
- 浅析Android的横竖屏切换
- hdu 4109(拓扑排序 关键路径)