最小生成树

最小生成树

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;
}


 


posted @ 2013-06-18 21:24  jlins  阅读(214)  评论(0编辑  收藏  举报