POJ 1251 Jungle Roads (zoj 1406) MST

原创 2013年12月05日 23:00:36

传送门:

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;
}


POJ1251Jungle Roads(最小生成树)

题目大意:首先给你一个图,需要你求出最小生成树,输入N个节点,用大写字母表示了节点,然后节点与节点之间有权值。 比如有9个节点,然后接下来有n-1行表示了边的情况,拿第一行举例 A 2 B 12 ...
  • Rain722
  • Rain722
  • 2017年01月30日 20:21
  • 980

zoj 1406 poj 1251 Jungle Roads

#include #include #include #include using namespace std; const int MAXN = 27; const int MAXM =...
  • Hearthougan
  • Hearthougan
  • 2013年11月26日 16:23
  • 520

HDU 1301 &POJ 1215 Jungle Roads【最小生成树,Prime算法+Kruskal算法】

Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T...
  • hurmishine
  • hurmishine
  • 2016年08月04日 21:39
  • 1669

POJ 1251 Jungle Roads (MST)

输入的时候需要转化 /*********************************************** * Author: fisty * Created Time: 2015...
  • u013008291
  • u013008291
  • 2015年02月28日 20:43
  • 293

poj 1251 Jungle Roads MST

水 /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indic...
  • czjxy881
  • czjxy881
  • 2013年01月30日 10:30
  • 216

poj -- 1251 Jungle Roads(mst)

题目大意:给出n条道路,及维护这个道路每个月的花费,由于维护成本太高,现在要停止维护一些道路,保证所有村庄都连通,问每个月的最小花费。 注意这道题的输入,先是给出道路数目n,随后n行,每一行开头一个...
  • u011346442
  • u011346442
  • 2015年02月08日 19:46
  • 190

Jungle Roads(最小生成树+并查集)

Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T...
  • cs_zlg
  • cs_zlg
  • 2012年11月13日 23:01
  • 1402

zoj - 1406 - Jungle Roads

题意:有n个村庄,村庄间有一些路,但有一些路可以不要也可连通所有村庄,为节约费用,deal with一些不必要的路,求最少维护总费用。 题目链接:http://acm.zju.edu.cn/onli...
  • SCNU_Jiechao
  • SCNU_Jiechao
  • 2012年12月11日 00:39
  • 679

zoj 1406 Jungle Roads(简单-MST)

同水过,手写kruskal。 #include #include #include #define INF 1000000 #define MAXM 80 #define MAXN 30 #defi...
  • cqlf__
  • cqlf__
  • 2012年01月27日 17:14
  • 548

ZOJ 1406 Jungle Roads

ZOJ 1406  Jungle Roads      第一道数据结构的ACM题目。关于最小生成树。感谢钟老师。      题意:给出一个图。      代码+细节如下:      #include...
  • weixinwei021
  • weixinwei021
  • 2013年07月07日 18:37
  • 589
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1251 Jungle Roads (zoj 1406) MST
举报原因:
原因补充:

(最多只允许输入30个字)