现在的位置: 首页 > 综合 > 正文

POJ 1251 Jungle Roads (zoj 1406) MST

2014年03月03日 ⁄ 综合 ⁄ 共 2452字 ⁄ 字号 评论关闭

传送门:

http://poj.org/problem?id=1251

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=406

POJ RE死了,改成cin救过了。。不过ZOJ原来的就能过,估计是POJ的数据多了个空格什么的。

1.prim

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

const int MAXN=27;
const int INF=99999;
int dis[MAXN];
int map[MAXN][MAXN];
int n;
void prim()
{
	bool vis[MAXN]={0};

	for(int i=0;i<n;i++)
			dis[i]=INF;

	int cur=0;
	vis[cur]=1;
	dis[cur]=0;

	for(int i=0;i<n;i++)
	{
		int mini=INF;
		for(int j=0;j<n;j++)
			if(!vis[j] && map[cur][j] !=INF && dis[j] > map[cur][j])//先选出地图上权值小的
				dis[j]=map[cur][j];

		for(int j=0;j<n;j++)
			if(!vis[j] && mini> dis[j])
				mini=dis[cur=j];
		vis[cur]=1;
	}

}

int main()
{
	while(scanf("%d",&n),n)
	{
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				map[i][j]=INF;


		for(int i=0;i < n-1;i++)
		{
			char temp;
			int from,len,to,cost;
			cin>>temp>>len;
			from=temp-'A';
			while(len--)
			{
				cin>>temp>>cost;
				to=temp-'A';
				map[from][to]=map[to][from]=cost;
			}	

		}
		prim();
		int sum=0;
		for(int i=0;i<n;i++)
			sum+=dis[i];
		printf("%d\n",sum);
	}

	return 0;
}

下面是ZOJ AC 但是 POJ RE的就是输入格式不同。

#include<cstdio>
#include<cstring>
const int MAXN=27;
const int INF=99999;
int dis[MAXN];
int map[MAXN][MAXN];
int n;
void prim()
{
	bool vis[MAXN]={0};

	for(int i=0;i<n;i++)
			dis[i]=INF;

	int cur=0;
	vis[cur]=1;
	dis[cur]=0;

	for(int i=0;i<n;i++)
	{
		int mini=INF;
		for(int j=0;j<n;j++)
			if(!vis[j] && map[cur][j] !=INF && dis[j] > map[cur][j])//先选出地图上权值小的
				dis[j]=map[cur][j];

		for(int j=0;j<n;j++)
			if(!vis[j] && mini> dis[j])
				mini=dis[cur=j];
		vis[cur]=1;
	}

}

int main()
{
	while(scanf("%d",&n),n)
	{
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				map[i][j]=INF;


		for(int i=0;i < n-1;i++)
		{
			getchar();
			char temp;
			int from,len,to,cost;
			scanf("%c %d",&temp,&len);
			from=temp-'A';
			for(int j=0;j<len;j++)
			{
				scanf(" %c %d",&temp,&cost);
				to=temp-'A';
				map[to][from]=map[from][to]=cost;
			}	
			
		}
		prim();
		int sum=0;
		for(int i=0;i<n;i++)
			sum+=dis[i];
		printf("%d\n",sum);
	}

	return 0;
}

方法2   kruskal

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=28;
const int INF=99999;
int dis[MAXN];
int n,city_cnt,sum;
int fa[MAXN];

struct city
{
	int x,y;
	int cost;
}a[MAXN*MAXN];

bool operator <(const city &x,const city &y)
{
	return x.cost<y.cost;
}

int find(int cur)
{
	return fa[cur]==cur? cur: fa[cur]=find(fa[cur]);
}

int main()
{
	while(scanf("%d",&n),n)
	{

		sum=city_cnt=0;
		for(int i=0;i < n-1;i++)
		{
			char temp;
			int from,num,to,cost;
			cin>>temp>>num;
			from=temp-'A';
			while(num--)
			{
				cin>>temp>>cost;
				to=temp-'A';
				a[city_cnt].x=from;
				a[city_cnt].y=to;
				a[city_cnt++].cost=cost;
			}	

		}

		sort(a,a+city_cnt);
		for(int i=0;i<n;i++)	
			fa[i]=i;

		for(int i=0;i<city_cnt;i++)
		{
			int root_x=find(a[i].x);
			int root_y=find(a[i].y);
			if(root_x!=root_y)
			{
				sum+=a[i].cost;
				fa[root_x]=root_y;
			}
		}
		printf("%d\n",sum);
	}

	return 0;
}

抱歉!评论已关闭.