hud-1863-畅通工程(最小生成树)
来源:互联网 发布:pc护眼软件 编辑:程序博客网 时间:2024/06/18 11:48
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 21225 Accepted Submission(s): 9138
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
?
//hdu-1863-畅通工程(最小生成树-克鲁是卡尔)//题目大意:有m个村庄,给出n条评估道路数,//问你能不能从这些路中选出几条使修路的费用最小;//若能,打印出最小费用,若否,打印“?”;//解题思路://本题属于最小生成树问题,运用克鲁斯卡尔算法求出最小生成树//首先,定义数组 per[110],用来存放村庄(即顶点),定义结构体数组//dalu[5000]用来存放评估道路的起点、终点、费用; //解决本题的关键就是连接函数link()的定义;//传入两个节点判断其是否在同一根节点上,若是,返回假//(表示此两点会构成环,不能相连),若否,可以相连,返回真; // 经过排序之后,通过主函数中的if对费用累加得到的就是最小费用//当然,上述是只有当根节点有一个时,才会成立,否则,道路就非联通,打印"?" #include<cstdio>#include<algorithm>using namespace std;int per[110];int n,m;struct node{int stat;int end;int price;}dlu[5000];int cmp(node x,node y){return x.price<y.price;}int init(){int i;for(i=1;i<=m;i++) per[i]=i;}int find(int x){int r=x;while(r!=per[r]) r=per[r];return r;}bool link(int x,int y){int fx=find(x),fy=find(y);if(fx!=fy){ //判断是否成环,是-返回假,否-返回真; per[fx]=fy;return true;}return false;}int main(){int j,sum,cnt;while(scanf("%d%d",&n,&m),n){sum=0;init();for(j=0;j<n;j++) scanf("%d%d%d",&dlu[j].stat,&dlu[j].end,&dlu[j].price);sort(dlu,dlu+n,cmp);//对费用升序排序; for(j=0;j<n;j++){if(link(dlu[j].stat,dlu[j].end)) sum+=dlu[j].price;}for(j=1,cnt=0;j<=m;j++)//统计根节点的数目; if(j==per[j]) cnt++;if(cnt>1) printf("?\n");else printf("%d\n",sum); }return 0;}当然,最后的判定道路是否联通可以优化一下,即不用 cnt 统计根节点的数目,而是在连接顶点的时候判断最后能否构成最小生成树,若是,那么打印出最小费用,若否,打印
“?”即可;代码如下:
sort排序开始: sort ( dlu, dlu + n, cmp );
for ( j = 0 cnt = 0;j < n; j + +) {
if ( link ( dlu [ j ].start, dlu [ j ].end)
{
sum+=dlu [ j ].price;
cnt + +;
}
}
if ( cnt == n-1 )
printf ( "%d\n",sum );
else
printf( "?\n" );
- hud-1863-畅通工程(最小生成树)
- Hud 1233 还是畅通工程[最小生成树Prim]
- Hud 1879 继续畅通工程[最小生成树(Kruscal)]
- 【最小生成树】hdu 1863 畅通工程
- HDU 1863 畅通工程(最小生成树)
- Hdu 1863 畅通工程【最小生成树】
- HDOJ 1863 畅通工程(最小生成树)
- hdoj 1863 畅通工程 【最小生成树】
- HDOJ 1863 畅通工程 (最小生成树]
- HDU 1863 畅通工程 最小生成树
- hdu 1863 畅通工程 最小生成树
- hdu 1863 畅通工程 (最小生成树)
- 最小生成树hdu 1863畅通工程
- HDU-1863-畅通工程【最小生成树】
- (最小生成树)HDU 1863 畅通工程
- HDU-1863--畅通工程---最小生成树
- HDU 1863 畅通工程【最小生成树】
- 畅通工程(最小生成树)
- NPOI进行Excel文件的导出
- 传播最广的一篇SVM算法博文
- HDU 1321 Reverse Text
- 数据结构学习笔记4-最长回文子串(Manacher算法)
- Epoll学习心得
- hud-1863-畅通工程(最小生成树)
- svn属性svn:keywords与auto-props的配置(运行配置区)
- Codeforces 567D One-Dimensional Battle Ships
- Apache Mahout的Taste基于Hadoop实现协同过滤推荐引擎的代码分析
- php 命令执行系列
- POJ 2014:Flow Layout 模拟水题
- 每日20行之3~~~ThreadPool之RegisterWaitForSingleObject 自动定时执行(可循环)
- HDU1863:畅通工程【Kruskal & Prim】
- HDOJ--1863--畅通工程