HDU-1863(最小生成树+并查集判断是否连通)
2012-07-21 20:39
274 查看
这道题目,可以看成先判断是否是连通的图,然后在求最小生成树,是一道小小的综合题目.
算法,有前几片的博文可供参考.
本题代码:
算法,有前几片的博文可供参考.
本题代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #define inf 0x3fffffff int N,M;//N represents the number of points,and M donats the number of edges; int visit[105]; int map[105][105]; int dis[105]; int set[105]; int tol; int find(int x) { return set[x]=(set[x]==x?x:find(set[x])); } void merge(int a,int b) { int x=find(a),y=find(b); if(x!=y) { set[x]=y; tol--; } } int prim() { for(int i=1;i<=N;i++) { dis[i]=inf; } dis[1]=0; for(int j=1;j<=N;j++) { int t=inf,pos; for(i=1;i<=N;i++) { if(!visit[i]&&t>dis[i]) { t=dis[i]; pos=i; } } visit[pos]=1; for(int i=1;i<=N;i++) { if(!visit[i]&&dis[i]>map[pos][i]&&map[pos][i]!=0x3f3f3f3f) { dis[i]=map[pos][i]; } } } int temp=0; for(i=1;i<=N;i++) { temp+=dis[i]; } return temp; } int main() { while(scanf("%d%d",&M,&N),M!=0) { int a,b,val; tol=N-1; memset(visit,0,sizeof(visit)); memset(map,0x3f,sizeof(map)); for(int j=1;j<=N;j++) set[j]=j; for(int i=1;i<=M;i++) { scanf("%d%d%d",&a,&b,&val); merge(a,b); if(val<map[a][b]) { map[a][b]=val; map[b][a]=val; } } if(tol>0) { printf("?\n"); continue; } int ans=prim(); printf("%d\n",ans); } return 0; }
相关文章推荐
- hdu-1863畅通工程 最小生成树克鲁斯卡尔算法kruskal(并查集实现)&&prim普利姆算法实现
- 关于最小生成树中的kruskal算法中判断两个点是否在同一个连通分量的方法总结
- 畅通工程 hdu 1863 最小生成树+并查集 浙大计算机研究生复试上机考试-2007年
- hdu1863-畅通工程 最小生成树的并查集实现方法
- HDU 1863 畅通工程 (最小生成树是否存在)
- hdu 1863 最小生成树+并查集 (Kruskal)
- hdu1863-畅通工程 最小生成树的并查集实现方法
- hdu 1863 畅通工程 最小生成树+并查集
- HDU 1863 并查集+最小生成树
- 并查集-用并查集判断图中是否有环(能够应用到kruskal的最小生成树)
- hdu 1272 小希的迷宫(并查集判断回路和是否连通)
- hdu 4514 并查集判断无向图是否有环+树(无环连通图)的直径(两次bfs)
- HDU 1863 畅通project (最小生成树是否存在)
- 并查集-用并查集判断图中是否有环(能够应用到kruskal的最小生成树)
- POJ 1679 The Unique MST(判断最小生成树是否唯一)
- poj 1679 The Unique MST(判断最小生成树是否唯一)
- HDU-1272 小希的迷宫(并查集判断输入的数据是否能成为一颗树)
- 最小生成树MST的Kruskal算法+并查集(链表实现)划分连通分量和集合,并查集可以保存多个集合
- HDU 4463 最小生成树 并查集
- NOJ1081组织集体活动——全连通判断+最小生成树