HDU 1233 还是畅通工程
2011-10-09 11:32
369 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233
题意:有1-----N个村庄,村庄与村庄之间要铺设公路,在使任意两个村庄都能相互到达的前提下使修路的花费最少
解题思路:这题是典型的最小生成树的题,可以选择prim算法或者kruskal算法。prim使用与稀疏图,二此题中的边有N*(N-1)/2条,因此最好是用kruskal算法。
kruskal算法的思想是贪心,每次选取边权值最小的,在此过程中要判断是否或产生回路,如果不会产生回路则将该边加入边集合中。
题意:有1-----N个村庄,村庄与村庄之间要铺设公路,在使任意两个村庄都能相互到达的前提下使修路的花费最少
解题思路:这题是典型的最小生成树的题,可以选择prim算法或者kruskal算法。prim使用与稀疏图,二此题中的边有N*(N-1)/2条,因此最好是用kruskal算法。
kruskal算法的思想是贪心,每次选取边权值最小的,在此过程中要判断是否或产生回路,如果不会产生回路则将该边加入边集合中。
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; struct A {int x,y,z;}a[5000]; int v[101]; int fun(A a1,A a2) { if(a1.z<a2.z)return 1; else return 0; } int find(int x) { while(x!=v[x]) {x=v[x];} return x; } void fp(int x,int y) { int a=find(x);int b=find(y); if(a!=b)v[a]=b; } int main() { /*freopen("1.txt","r",stdin);*/ int n; while(cin>>n&&n) { int m=n*(n-1)/2; for(int i=1;i<=n;i++)v[i]=i; //初始化 for(int i=0;i<m;i++) { scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z); } int sum=0;sort(a,a+m,fun); //根据权值由小到大进行排序 for(int i=0;i<m;i++) { if(find(a[i].x)!=find(a[i].y)) //判断是否会产生回路 { sum+=a[i].z;fp(a[i].x,a[i].y); } } printf("%d\n",sum); } }
相关文章推荐
- HDU - 1233 还是畅通工程(最小生成树)
- HDU-1233 还是畅通工程 (prim 算法求最小生成树)
- HDU 1233 还是畅通工程 并查集 (单向点连通)
- Hdu 1233 还是畅通工程
- HDU 1233 还是畅通工程
- hdu-1233 还是畅通工程(最小生成树)
- HDU 1233 还是畅通工程
- HDU 1233 还是畅通工程(最小生成树Kruskal)
- hdu 1233 还是畅通工程
- HDU 1233 还是畅通工程(最小生成树)
- HDU 1233 还是畅通工程 并查集 (单向点连通)
- 还是畅通工程(最小生成树)【HDU】-1233
- HDU 1233 还是畅通工程(最小生成树)
- hdu 1233 还是畅通工程(最小生成树prim)
- HDU 1233 还是畅通工程(模板——克鲁斯卡尔算法)
- HDU 1233 还是畅通工程
- HDU 1233 还是畅通工程(最小生成树)
- HDU 1233 还是畅通工程 并查集 (单向点连通)
- HDU 1233 还是畅通工程(最小生成树kruskal)
- hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)