最小生成树

最小生成树

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;imap[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;ic)
				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
#include
#include
#include
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



你可能感兴趣的:(数据结构)