最小生成树
POJ-1287-Networking
http://poj.org/problem?id=1287
赤裸裸的最小生成树
最小生成树也称最小代价树,即各边的代价之和最小
最小生成树可用Prim算法,也可用Kruskal算法
Prim算法是基于顶点来实现最小生成树,Kruskal算法是基于边来实现最小生成树
Prim算法:
#include<stdio.h> #include<string.h> #include<stdlib.h> #define maxvalue 0x7fffffff int map[105][105]; int n; int prim() { int i,j,temp,v,sum; int visit[105],dis[105]; for(i=1;i<=n;i++) dis[i]=map[1][i]; dis[1]=0; memset(visit,0,sizeof(visit)); visit[1]=1; sum=0; for(i=1;i<n;i++) { temp=maxvalue; for(j=1;j<=n;j++) if(visit[j]==0&&dis[j]<=temp) { temp=dis[j]; v=j; } sum+=temp; visit[v]=1; for(j=1;j<=n;j++) if(visit[j]==0&&map[v][j]<dis[j]) dis[j]=map[v][j]; } return sum; } int main() { int i,j,t; int a,b,c,ans; while(scanf("%d",&n),n) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) map[i][j]=maxvalue; scanf("%d",&t); while(t--) { scanf("%d %d %d",&a,&b,&c); if(map[a][b]>c) { map[a][b]=map[b][a]=c; } } ans=prim(); printf("%d\n",ans); } return 0; }
Kruskal算法:
#include<stdio.h> #include<string.h> #include<stdlib.h> #define maxvalue 0x7fffffff struct cam { int x; int y; int len; }list[2005]; //开始数组开小了,WA了好几次 int f[105]; int n; int cmp(const void *a,const void *b) { return (*(struct cam *)a).len-(*(struct cam *)b).len; } void init() //并查集判断两个顶点是否在不同的分图中 { int i; for(i=1;i<=n;i++) f[i]=i; } int find(int x) { int r=x; while(f[r]!=r) r=f[r]; f[x]=r; return r; } int Union(int x,int y) { int fx,fy; fx=find(x); fy=find(y); if(fx!=fy) { f[fx]=fy; return 1; } return 0; } int main() { int i,t; int num,ans; while(scanf("%d",&n),n) { scanf("%d",&t); for(i=0;i<t;i++) scanf("%d %d %d",&list[i].x,&list[i].y,&list[i].len); qsort(list,t,sizeof(struct cam),cmp); num=1; ans=0; init(); for(i=0;i<t;i++) { if(Union(list[i].x,list[i].y)) { num++; ans+=list[i].len; if(num==n) //当集合中有n个点时即退出 break; } } printf("%d\n",ans); } return 0; }
posted on 2012-06-21 17:21 java课程设计例子 阅读(293) 评论(0) 编辑 收藏 举报