最小生成树
POJ-1287-Networking
http://poj.org/problem?id=1287
最小生成树问题,可用Prim算法,也可用Kruskal算法
Prim算法是基于顶点来实现最小生成树,Kruskal算法是基于边来实现最小生成树
Prime算法,用java写的
import java.util.Scanner; //无穷大量 class MAX { static int num=0x3f3f3f3f; } class prime{ int n; int[][] map=new int[105][105]; int[] dis=new int[105]; int[] visit=new int[105]; public void init(int[][] a,int m) { n=m; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { map[i][j]=a[i][j]; } for(int i=1;i<=n;i++) visit[i]=0; visit[1]=1; for(int i=1;i<=n;i++) dis[i]=map[1][i]; dis[1]=0; } public int solve() { int i,j,Min,v,sum=0; //每次加入一个节点 for(i=1;i<n;i++) { Min=MAX.num; v=0; for(j=1;j<=n;j++) if(visit[j]==0&&dis[j]<Min) { Min=dis[j]; v=j; } sum+=Min; visit[v]=1; for(j=1;j<=n;j++) if(visit[j]==0&&dis[j]>map[v][j]) dis[j]=map[v][j]; } return sum; } } public class Main{ public static void main(String args[]) { int nn,m; int[][] mapp=new int[105][105]; Scanner t=new Scanner(System.in); while(true) { //初始化为无穷大 for(int i=0;i<105;i++) for(int j=0;j<105;j++) mapp[i][j]=MAX.num; nn=t.nextInt(); if(nn==0) break; m=t.nextInt(); int a,b,c; for(int i=0;i<m;i++) { a=t.nextInt(); b=t.nextInt(); c=t.nextInt(); if(mapp[a][b]>c) mapp[a][b]=mapp[b][a]=c; } prime s=new prime(); s.init(mapp,nn); System.out.println(s.solve()); } t.close(); } }
Kruskal算法,用C写的
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> struct bian { int x; //起点 int y; //终点 int len; //距离 }list[2005]; int f[105]; int n,m;//n个点,m条边 int cmp(const void *a,const void *b) { return (*(struct bian *)a).len-(*(struct bian *)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[fy]=fx; return 1; } return 0; } int main() { int i,t,ans,num; while(scanf("%d",&n),n) { scanf("%d",&m); t=0; for(i=0;i<m;i++) { scanf("%d %d %d",&list[i].x,&list[i].y,&list[i].len); } qsort(list,m,sizeof(struct bian),cmp); ans=0; num=0; init(); for(i=0;i<m;i++) { if(Union(list[i].x,list[i].y)) { ans+=list[i].len; num++; if(num==n-1) break; } else continue; } printf("%d\n",ans); } return 0; }