HDU 1863 畅通工程
2014-05-08 19:51
316 查看
杭电 1863 畅通工程
题目是中文,就不用多说了.#include<stdio.h> #include<algorithm> //算法,sort using namespace std; struct engin{ int a,b,c; }bug[5000]; int p[2000],cc,n,m; int cmp(engin x,engin y) { return x.c<y.c; } int find(int x) { return p[x]==x?p[x]:find(p[x]); } void kruskal() { int i,sum=0; for(i=1;i<=m;i++)//父节点数组初始化 p[i]=i; sort(bug+1,bug+n+1,cmp); for(i=1;i<=n;i++) { int x=find(bug[i].a); int y=find(bug[i].b); if(x!=y) { cc++; sum+=bug[i].c; p[x]=y; } } if(cc==m) printf("%d\n",sum); else printf("?\n"); } int main() { while(scanf("%d%d",&n,&m)&&n) { int i; cc=1; for(i=1;i<=n;i++) scanf("%d%d%d",&bug[i].a,&bug[i].b,&bug[i].c); kruskal(); } return 0; }
用的方法是kruskal.
通过建立结构体 来保存输入.
按权值大小进行排序,建立一个用于保存父节点是多少的数组,数组初始为各自本身.通过find函数来找父节点,当所有村庄的p数组值相同就说明所有村庄都已经链接在一起了,当然也可以通过一个变量cc来统计中间连接村庄的次数.
相关文章推荐
- hdu 1863 畅通工程 (prim与并查集)
- hdu 1863畅通工程(prim,邻接矩阵)
- hdu 1863 畅通工程
- 【最小生成树+Prim】杭电 hdu 1863 畅通工程
- hdu 1863 畅通工程
- HDU 1863 畅通工程
- HDU 1863 畅通工程
- HDU-1863-畅通工程(最小生成树)
- hdu 1863 畅通工程
- hdu 1863 畅通工程(并查集+快排)
- hdu1863-畅通工程
- hdu 1863 畅通工程(prim算法实现和kruskal算法实现)
- 浙大复试机试题 HDU 1863——畅通工程
- HDU1863 畅通工程【Kruskal算法+并查集】
- hdu 1863 畅通工程(Kruskal+并查集)
- HDU 1863 畅通工程 (最小生成树)
- HDU 1863 畅通工程 (最小生成树)
- HDU 1863 畅通工程
- HDU 1863 畅通工程【Prim】
- hdu 1863 畅通工程(最小生成树,基础)