最小生成树

最小生成树

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;

}


 


你可能感兴趣的:(最小生成树)