hdu1233 并查集+Kruskal
2012-12-03 21:55
113 查看
题意:n个城市,给出城市间的距离,求最短路;
利用Kruskal算法:
先选取最短路,再从该集合外找次短路。
并查集思想:
将多点合并的方法为对其父节点p【】赋值指向根节点。
找到亮点父节点,根据父节点来判断是否合并。
[align=left]Sample Input[/align]
[align=left]Sample Output[/align]
过程中 运用sort时 范围没控制好超时
p[i]赋值时 范围错误 WA。。。
利用Kruskal算法:
先选取最短路,再从该集合外找次短路。
并查集思想:
将多点合并的方法为对其父节点p【】赋值指向根节点。
找到亮点父节点,根据父节点来判断是否合并。
[align=left]Sample Input[/align]
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
[align=left]Sample Output[/align]
3 5
过程中 运用sort时 范围没控制好超时
p[i]赋值时 范围错误 WA。。。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int p[121],sum; struct node{ int c1; int c2; int len; }q[10000]; bool cmp(node q1,node q2) { return q1.len<q2.len; } int find(int x) { if(x!=p[x]) p[x]=find(p[x]); return p[x]; } void unions(int x,int y) { p[x]=y; } int main() { //freopen("input.txt","r+",stdin); int i,n,m,fx,fy; while(scanf("%d",&n)&&n) { sum=0; m=n*(n-1)/2; for(i=1;i<=m;i++) { scanf("%d%d%d",&q[i].c1,&q[i].c2,&q[i].len); } for(i=1;i<=n;i++) p[i]=i; sort(q+1,q+m+1,cmp); for(i=1;i<=m;i++) { fx=find(q[i].c1); fy=find(q[i].c2); if(fx!=fy) { sum+=q[i].len; unions(fx,fy); } } cout<<sum<<endl; } return 0; }
相关文章推荐
- HDU 1233 还是畅通工程 并查集 (单向点连通)
- hdu 1233
- hdu 1233 kruskal + 并查集
- 【HDU 1233】还是畅通工程
- hdu 1233 还是畅通工程
- hdu1233-还是畅通工程
- hdu 1233 Kruskal求最小生成树
- hdu_1233 还是畅通工程
- HDU-1233 还是畅通工程
- HDU - 1233 还是畅通工程 prim算法(裸模板)
- 还是畅通工程(最小生成树)【HDU】-1233
- HDU_1232畅通工程+HDU_1233还是畅通工程
- HDU 1233 还是畅通工程
- HDU 1233 还是畅通工程
- hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集
- hdu 1233(最小生成树)
- hdu 1233 还是畅通工程
- hdu 1233 还是畅通工程
- hdu 1233 还是畅通工程(kruskal求最小生成树)
- HDU 1233 prim kruskal最小生成树