畅通工程

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 21272    Accepted Submission(s): 9154

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 ?
 思路:额,这是一道最小生成树的问题,题目的关键就在于求的最小生成树,具体做法就是按权值排序,然后先连权值小的,有一点需要注意的就是如何判断畅通,嗯,如果只有一个根节点的话肯定就是畅通的啦。
ac代码:

#include<stdio.h>
#include<algorithm>
using namespace std;
int per[1010],n,m;
struct node{int b,e,l;
}edge[1010];
bool cmp(node c, node d){return c.l<d.l;
}
void init(){for(int i=1;i<=m;i++)per[i]=i;
}
int find(int x){int r=x;while(r!=per[r]){r=per[r];}int i=x,j;while(i!=r){j=per[i];per[i]=r;i=j;}return r;
}
int join(int a,int b){int fa=find(a);int fb=find(b);if(fa!=fb){per[fa]=fb;return 1;}elsereturn 0;
}
int main(){while(scanf("%d%d",&n,&m)!=EOF&&n!=0){init();int i;for(i=0;i<n;i++)scanf("%d%d%d",&edge[i].b,&edge[i].e,&edge[i].l);sort(edge,edge+n,cmp);int sum=0;for(i=0;i<n;i++){if(join(edge[i].b,edge[i].e))sum+=edge[i].l;}int cnt=0;for(i=1;i<=m;i++){if(per[i]==i)cnt++;}if(cnt==1)printf("%d\n",sum);elseprintf("?\n");}return 0;
}

今天再次修改一下,之前用的是kruskal,现在用prime算法再做一次,已经ac了。如果今天有空的话可能会总结一下这两个算法的区别。

ac代码:

#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
int vis[101],map[101][101],dis[101],n,sum,m,flag;
void prime(){int i;sum=0;for(i=1;i<=m;i++)dis[i]=map[1][i];vis[1]=1;for(i=1;i<m;i++){int temp=INF,j,k;for(j=1;j<=m;j++)if(vis[j]==0&&dis[j]<temp)temp=dis[k=j];if(temp==INF){flag=1;break;}vis[k]=1;sum+=temp;for(j=1;j<=m;j++)if(vis[j]==0&&dis[j]>map[k][j])dis[j]=map[k][j];}
}
int main(){while(scanf("%d%d",&n,&m)!=EOF&&n!=0){int i;flag=0;memset(map,INF,sizeof(map));memset(vis,0,sizeof(vis));for(i=1;i<=n;i++){int a,b,cost;scanf("%d%d%d",&a,&b,&cost);map[a][b]=map[b][a]=cost;}prime();if(flag)printf("?\n");elseprintf("%d\n",sum);}return 0;
}

HDOJ--1863--畅通工程相关推荐

  1. HDOJ:1863畅通工程

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

  2. HDOJ 1863畅通工程(最小生成树kruskal算法并查集实现)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863 最小生成树kruskal算法:http://www.zhuoda.org/irini/78592.h ...

  3. 并查集 HDOJ 1232 畅通工程

    题目传送门 1 /* 2 并查集(Union-Find)裸题 3 并查集三个函数:初始化Init,寻找根节点Find,连通Union 4 考察:连通边数问题 5 */ 6 #include <c ...

  4. HDU 1863 畅通工程

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

  5. HDOJ 1875 畅通工程再续

    这个畅通工程还是一交就过,看来畅通工程用来入门是最好了,以后拿这些来挂就不会那么打击人了,天天开心.这里求最小生成树之前要自己构图,很简单就是求出点到点之间的距离,如果距离大于1000和小于10都视作 ...

  6. 杭电1863畅通工程

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

  7. hdoj 还是畅通工程

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  8. HDU 1863畅通工程(最小生成树)(prim算法)

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

  9. HDU——1863 畅通工程(最小生成树问题)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 题意:有m个村庄,还给出了n条道路的具体信息.问你能否使m个村庄畅通,且最小花费是多少? 解题思 ...

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

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

最新文章

  1. kafka 主动消费_SpringBoot2 整合Kafka组件,应用案例和流程详解
  2. 机器学习笔记:auto encoder
  3. Angular 2/Ionic 2 @input和@output理解
  4. SAP Spartacus的自定义路由
  5. [蓝桥杯][2019年第十届真题]糖果(状压dp)
  6. 新疆大学ACM新生赛(公开赛)
  7. 【mysql的设计与优化专题(6)】mysql索引攻略
  8. WEB消息提醒实现之二 实现方式-Jquery Ajax长轮询
  9. java html转换xml文件,使用Java在HTML中转换XML + XSL
  10. mysql setautocommit_MySql 中的setAutoCommit方法
  11. Flutter拓展 一步一步教你安装Flutter(最火的移动框架)
  12. Hibernate教程——我的笔记
  13. vmware使用显卡
  14. 成功的发行模式(标题 我自己改的 转至 敏思博客)
  15. Nodejs ORM Prisma 介绍
  16. PG数据库查看数据大小参考
  17. ftp远程登陆常用命令
  18. java计算机毕业设计springboot+vue学生宿舍管理系统
  19. java如何连接rfid_Java + Uno + RFID:java中的调用方法读取rfid
  20. python 电梯运行_面向对象电梯系列总结

热门文章

  1. 一部亚马逊4.5高分的领域经典,首次落地中国
  2. 面向对象的两大迷思,再给你们解答一次
  3. assert()和panic()
  4. 63相似、合同、相抵
  5. VMware安装Linux时‘Operating System Not Found‘的解决方法
  6. 简单易懂——Dijkstra算法讲解
  7. PyTorch:损失函数loss function
  8. pandas小记:pandas索引和选择
  9. innodb 索引 mysql_InnoDB索引实现
  10. python ndarray转binary_Python 实现Image和Ndarray互相转换