HDU 1879 继续畅通工程
来源:互联网 发布:sma4软件下载 编辑:程序博客网 时间:2024/05/17 11:58
杭电 1879 继续畅通工程
题目中文,还是不解释,直接上代码.
#include<stdio.h> #include<algorithm>#include <iostream> using namespace std; struct engin{ int a,b,c,d;}bug[5000]; int p[105],n,m; int cmp(engin x,engin y) {if(x.d!=y.d)return x.d<y.d;// 先排序d 是否已经修建 return x.c<y.c; //在同样没有修建的情况下,比较权值 }int find(int x) {if (x!=p[x])p[x]=find(p[x]); //找出他们的父亲节点,也就是最终到p[m]最后的数值一样就输出sum return p[x]; } void kruskal() { int i,sum=0; sort(bug+1,bug+m+1,cmp); for(i=1;i<=m;i++) { int x=find(bug[i].a); int y=find(bug[i].b); if(x!=y&&!bug[i].d) {sum+=bug[i].c; p[x]=y; } } printf("%d\n",sum); }void join(int x,int y) { x=find(x); y=find(y); if(x!=y) p[x]=y; } int main() { while(scanf("%d",&n)&&n) { int i;m=n*(n-1)/2; for(i=1;i<=n;i++) p[i]=i; for(i=1;i<=m;i++) {scanf("%d%d%d%d",&bug[i].a,&bug[i].b,&bug[i].c,&bug[i].d); if(bug[i].d==1) join(bug[i].a,bug[i].b);//如果已经修建,就把它加入到已经修建的序列里面 }kruskal(); } return 0; }
因为这个题目是增加了一个之前两个村庄是否相连的数据,所以,首先在排序的时候应该要把是否相连放在第一,然后才是权值,还有当两村庄已经相连时,一个月把他们之间加入到 已经修建的序列里,即把他们的父节点改成不是他们自己,加入树中.
0 0
- HDU 1879 继续畅通工程
- 继续畅通工程 hdu 1879
- hdu 1879 继续畅通工程
- HDU 1879 继续畅通工程
- hdu 1879 继续畅通工程
- hdu 1879 继续畅通工程
- HDU 1879 继续畅通工程
- hdu 1879 继续畅通工程
- hdu 1879 继续畅通工程
- hdu 1879 继续畅通工程
- HDU 1879 继续畅通工程
- hdu 1879 继续畅通工程
- hdu - 1879 - 继续畅通工程
- hdu 1879 继续畅通工程
- hdu 1879 继续畅通工程
- hdu 1879 继续畅通工程
- hdu 1879(继续畅通工程)
- hdu 1879 继续畅通工程
- 选课_DP
- 学习node js 之微信公众帐号接口开发 准备工作
- 深入理解JavaScript系列(10):JavaScript核心(晋级高手必读篇)
- 深入理解JavaScript系列(11):执行上下文(Execution Contexts)
- OCP-1Z0-051 第105题 NVL,DECODE,NULLIF,TRUNC,TO_CHAR函数使用
- HDU 1879 继续畅通工程
- 用enumitem宏包做一个首行空两格,第二行顶格的列表环境怎么做
- 深入理解JavaScript系列(12):变量对象(Variable Object)
- UIPanel Static属性限制子对象属性变化 check if widgets wont move
- 工作三年流水帐
- POST 提交数据过程中报403错误
- cocos2d-x 动画加载 延时执行
- cocos2d之Box2D详解 删除物理世界对象
- OC学习笔记之OC对象的内存管理二