poj 1285 Agri-Net(prim || kruskal)

基本上已经不用看前面写过的算法了,这两个算法已经基本上熟练了,这次还使用的两种方法做的,

kruskal算法:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
	int i,j;
	int len;
}node;
int ans;
node map[10005];
int p[105];
int cmp(const void *a,const void *b)
{
	return ((node*)a)->len-((node*)b)->len;
}
int find(int x)
{
	return p[x]==x?x:p[x]=find(p[x]);
}
void kruskal()
{
	int sum=0;
	for(int i=1;i<ans;i++)
	{
		int x=find(map[i].i);
		int y=find(map[i].j);
		if(x!=y)
		{
			sum+=map[i].len;
			p[x]=y;
		}
	}
	printf("%d\n",sum);
}
int main()
{
	int n,i,j,c;
	while(scanf("%d",&n)!=EOF)
	{
		ans=1;
		memset(map,0,sizeof(map));
		memset(p,0,sizeof(p));
		for(i=1;i<=n;i++)
			p[i]=i;
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
			{
				scanf("%d",&c);
				if(c!=0)
				{
				 map[ans].i=i;
				 map[ans].j=j;
				 map[ans++].len=c;
			    }
			}
		qsort(map+1,ans-1,sizeof(map[0]),cmp);
		kruskal();	
	}
}
 

Prim算法:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<limits.h>
int n;
int map[105][105]; 
void prim()
{
	int dis[105],visit[105],sum=0,now,i,j,min;
	memset(visit,0,sizeof(visit));
	for(i=1;i<=n;i++)
		dis[i]=INT_MAX;
	dis[1]=0,visit[1]=1,now=1;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(!visit[j]&&dis[j]>map[now][j])
				dis[j]=map[now][j];
		}
		min=INT_MAX;
		for(j=1;j<=n;j++)
			if(!visit[j]&&dis[j]<min)
				min=dis[now=j];
		visit[now]=1;		
	}	
	for(i=1;i<=n;i++)
		sum+=dis[i];
	printf("%d\n",sum);
}
int main()
{
	int i,j,c;
	while(scanf("%d",&n)!=EOF)
	{
		memset(map,0,sizeof(map));
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
			{
				scanf("%d",&c);
				if(c!=0)
				  map[i][j]=c;
			    else
			    	map[i][j]=INT_MAX;
			}
		prim();	
	}
} 


你可能感兴趣的:(poj 1285 Agri-Net(prim || kruskal))