poj 1258Agri-Net(prime,Kruskal )

prime

#include<iostream>
#include<cstring>
using namespace std;
int a[101][101];//矩阵表示图
int lowcost[101], closest[101];//初始都为0
int Prim(int n)
{
	int i, j, k, temp, min;//temp记录每个过程中加入集合V的点,min记录每个过程中加入的边长
	int sum=0 ;
	
	for(i=0; i<n; i++)
	{
		lowcost[i]=a[0][i];
		closest[i]=0;
	}
	for(i=1; i<n; i++)
	{
		min=99999;
		for(j=0; j<n; j++)//在V-U中找出离U最近的顶点temp
		{
			if(lowcost[j] && min>lowcost[j])
			{
				min=lowcost[j];
				temp=j;
			}
		}
		lowcost[temp]=0;//标记temp已加入U
		sum+=min;
		for(j=0; j<n; j++)//更新 lowcost, closest;
			if(a[temp][j]!=0 && a[temp][j]<lowcost[j])
			{
				lowcost[j]=a[temp][j];
				closest[j]=k;
			}
	}
	return sum;
}
int main()
{
	int n;
	int i, j;
	while( cin>>n )
	{
		for(i=0; i<n; i++)
			for(j=0; j<n; j++)
				cin>>a[i][j];
			cout<<Prim(n)<<endl;
	}
	
}

Kruskal

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct Edge
{
	int start;//边的起点
	int end;//边的中点
	int weight;//边的权值
}edge[10000];
int a[101][101];//矩阵表示图
int parent[101], num[101];
void Make(int n)
{
	int i;
	for(i=0; i<n; i++)
	{
		parent[i]=i;
	//	num[i]=1;
	}
	
}
int Find(int x)
{
	if( parent[x]==x)
		return x;
	parent[x]=Find( parent[x]);//路径压缩
}
void Union(int i, int j)
{
	int x, y;
	x=Find(i);
	y=Find(j);
	if(x!=y)
	{
		parent[y]=x;
	//	num[x]+=num[y];
	}
}
int Kruskal(int n)
{
	int i, number;
	int start1, end1;
	int sum=0;
	Make(n);//初始化并查集
	number=1;
	for(i=0; number<n; i++)
	{
        start1=edge[i].start;
		end1=edge[i].end;
		
		if( Find(start1)!=Find(end1) )
		{
			sum+=edge[i].weight;
			number++;
			Union(start1, end1);
		}
	}
	return sum;
}
int cmp(struct Edge a, struct Edge b)
{
	return a.weight<b.weight;
}
int main()
{
	int n;
	int i, j, k;
	while( cin>>n )
	{
		k=0;
		for(i=0; i<n; i++)
			for(j=0; j<n; j++)
			{
				cin>>a[i][j];
				if( a[i][j]!=0 )
				{
					edge[k].start=i;
					edge[k].end=j;
					edge[k].weight=a[i][j];
					k++;
				}
			}
			sort(edge, edge+k, cmp);
			cout<<Kruskal(n)<<endl;
	}
}


你可能感兴趣的:(poj 1258Agri-Net(prime,Kruskal ))