HDU_1301 Jungle Roads
2012-06-17 21:05
323 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1301
#include <cstdio> #include <algorithm> using namespace std; struct edge { int u,v,w; }node[900]; int parents[900]; void UFset() { for(int i=0;i<900;i++) parents[i]=-1; } int Find(int x) { int s; for(s=x;parents[s]>=0;s=parents[s]); while(s!=x) { int tmp=parents[x]; parents[x]=s; x=tmp; } return s; } void Union(int R1,int R2) { int r1=Find(R1),r2=Find(R2); int tmp=parents[r1]+parents[r2]; if(parents[r1]>parents[r2]) { parents[r1]=r2; parents[r2]=tmp; } else { parents[r2]=r1; parents[r1]=tmp; } } int cmp(edge a,edge b) { return a.w<b.w; } int Kruskal(int n,int count) { int sum=0,num=0;//sum为权值num为选用边数 int u,v; UFset(); for(int i=0;i<count;i++) { u=node[i].u; v=node[i].v; if(Find(u)!=Find(v)) { Union(u,v); sum+=node[i].w; num++; } if(num>=n-1) break; } return sum; } int main() { int n,k,q,count;//k表示有几个连通点,q表示权值 char m,t;//m表示由谁开始,t表示由谁结束 while(scanf("%d",&n)!=EOF&&n) { count=0; for(int i=0;i<n-1;i++) { getchar(); scanf("%c",&m); scanf("%d",&k); for(int j=0;j<k;j++) { getchar(); scanf("%c",&t); scanf("%d",&q); node[count].u=m-'A'; node[count].v=t-'A'; node[count].w=q; count++; } } sort(node,node+count,cmp); printf("%d\n",Kruskal(n,count)); } return 0; }
相关文章推荐
- hdu 1301 Jungle Roads (基础最小生成树)
- HDU 1301 Jungle Roads
- HDU--1301--Jungle Roads(最小生成树)
- HDU 1301 Jungle Roads (最小生成树) By-小宇
- HDU1301-Jungle Roads
- hdu1301 Jungle Roads 【最小生成树】
- hdu1301 Jungle Roads
- HDU-1301 Jungle Roads(最小生成树[Prim])
- HDU 1301 Jungle Roads (最小生成树)
- HDU1301 Jungle Roads
- HDU 1301 Jungle Roads
- POJ-1251 && HDU-1301 -Jungle Roads [最小生成树]
- hdu 1301 Jungle Roads
- HDU 1301--Jungle Roads 【Kruskal】
- poj1251 hdu 1301 Jungle Roads
- HDU 1301 Jungle Roads (最小生成树)kruskal
- HDU-1301-Jungle Roads
- HDU-1301 Jungle Roads
- HDU 1301 Jungle Roads
- HDU 1301 && POJ 1251 jungle Roads