记录编号 36639 评测结果 AAAAAAAAAA
题目名称 空中楼阁 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.077 s
提交时间 2012-03-15 20:14:00 内存使用 2.78 MiB
显示代码纯文本
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define readfile(str) freopen(str,"r",stdin)
#define writefile(str) freopen(str,"w",stdout)
#define MAXN 811
#define MAX 1000000000

int N,M,T;
int Ans=MAX;
int Bridge[82][11];
int Map[MAXN][MAXN];
int Abut[MAXN];
int C;
int flag[MAXN];
int dist[MAXN];
	
inline int GetNextSt(int now)
{
	if(now<=T-1)
		return now+1;
	return 1;
}


void init()
{
	scanf("%d %d %d\n",&N,&M,&T);
	int p=0;
	int i,j;
	for (i=1;i<=N+1;i++)
		for (j=1;j<=T;j++)
			Bridge[i][j]=++p;
	C=N+1;
	
	
	int a,b;
	int x,y,tmp;
	for (i=1;i<=T;i++)
	{
		tmp=GetNextSt(i);
		for (j=1;j<=M;j++)
		{
			scanf("%d %d\n",&a,&b);
			if(a==0) a=C;
			if(b==0) b=C;
			
			x=Bridge[a][i];
			y=Bridge[b][tmp];
			Map[x][++Abut[x]]=y;
			
			x=Bridge[b][i];
			y=Bridge[a][tmp];
			Map[x][++Abut[x]]=y;
		} 
	}

	for (i=1;i<=N+1;i++)
	{
		for (j=1;j<=T;j++)
		{
			tmp=GetNextSt(j);
			x=Bridge[i][j];
			y=Bridge[i][tmp];
			Map[x][++Abut[x]]=y;
		}	
	}
	N=p;
}

int GetShortestPath()
{
	int S=1;

	int i,j;
	
	for (i=1;i<=N;i++)
	{
		dist[i]=MAX;
		flag[i]=0;
	}
	for (i=1;i<=Abut[S];i++)
		dist[Map[S][i]]=1;
	
	dist[S]=0;
	for (i=2;i<=N;i++)
	{
		int tmp=MAX;
		int u=S;
		for(j=1;j<=N;j++)
		{
			if(!flag[j] && dist[j]<tmp)
			{
				u=j;
				tmp=dist[j];
			}
		}
		flag[u]=1;
		
		for(j=1;j<=Abut[u];j++)
		{
			if(!flag[Map[u][j]])
			{
				int newdist=dist[u]+1;
				if(newdist<dist[Map[u][j]])
				{
					dist[Map[u][j]]=newdist;
				}
			}
		}
	}
	int Res=MAX;
	int x;
	for (i=1;i<=T;i++)
	{
		x=Bridge[C][i];
		if(dist[x]<Res)
			Res=dist[x];
	}
	return Res;
}

int main()
{
	readfile("house.in"),writefile("house.out");
	init();
	int Res=GetShortestPath();
	if(Res!=MAX)
		printf("%d\n",Res);
	else
		printf("Poor Z4!\n");
	return 0;
}