空中楼阁 4.14

题面:话说Z4阴差阳错地来到了神秘岛。不久,他们发现,这是一个由n个小岛和一个中心岛组成的群岛,群岛之间有m座桥。令他们感到惊讶的是,这些桥并不是固定不变的,经较长时间的观察,发现它们会随时间作周期性的变化(即桥的两端会不断更换)。

立方很早就留意到远远的那个中心岛了。他发现岛的上空好像有一个很巨大的东西,但实在太远了,看不清楚。此时jakrinchose得意地从身上拿出一个超高倍数望远镜,好像很自豪的样子,因为他平时专门用来看美女的工具此时终于派得上用场了。

“那是一间小屋!架在一棵好大好大的树上!”

“Terrific!我们也许可以暂时在那安顿,好用来遮风避雨!

于是他们便决定前往中心岛上的那间空中楼阁。Z4的懒惰是出了名的,他们当然希望越早到越好,那么,你能帮帮他们吗?

为方便计算,Z4把小岛按1..n编号,0表示中心岛。Z4一开始在编号为1的小岛上。在岛上行走的时间忽略不计,过桥的时间为1个单位。岛上的桥变化的周期为T,在nT+i(n=0,1,2,…;i=1,2,…,T)时刻岛上的桥为第i种状态,一开始的时刻为1。两个小岛间可能有多条桥相连。在任一时刻,Z4可以选择过桥,也可以原地不动。当然,如果无桥可过,Z4只能在原地等待。

【输入格式】

输入文件house.in的第一行包括三个整数n1<=n<=80),m(1<=m<=10000)T(1<=T<=10),分别表示小岛的个数,岛上桥的数量和桥改变的周期T。

    接下来分别描述第1..T种状态,每种状态有m行,每行有两个整数a, b(0<=a,b<=n),表示这种状态时小岛a和b有一条桥相连。两状态之间用一空行隔开。

【输出格式】

输出文件house.out仅有一个整数,表示Z4最少得花多少时间到达中心岛。如果Z4无法到达中心岛,则输出“Poor Z4!”。

 

【输入样例1】

4 5 2

1 2

1 3

1 4

2 0

4 0

 

1 3

1 3

2 3

4 3

3 0

 

【输出样例1】

2

 

 

【输入样例2】

7 3 2

1 2

1 4

6 0

 

2 5

3 6

4 7

 

【输出样例2】

Poor Z4!


这题其实是spfa,比一般的最短路多出了一维是记录时间;

map[i][j][k]表示时刻为k时 i是否可以到达j;

dis[i][j]表示在时刻j到达点i的最小值;

#include<bits/stdc++.h>
#define N 100
using namespace std;
int Map[N][N][N],dis[N][N],n,m,T;bool limit[N][N];
struct node{
	int id,ti;
};inline void spfa(){
	for(int i=0;i<N;i++)
		for(int j=0;j<N;j++)
			dis[i][j]=20021109;
	queue<node>q;q.push(node{1,0});dis[1][0]=0;limit[1][0]=1;
	while(!q.empty()){
		int u=q.front().id,t=q.front().ti;
		q.pop();limit[u][t]=0;
		int tt=(t+1)%T;
		for(int i=0;i<=n;i++){
			if(!Map[u][i][t])continue;//注意当前时刻是t,而不是tt
			if(dis[u][t]+1<dis[i][tt]){
				dis[i][tt]=dis[u][t]+1;
				if(!limit[i][tt]){
					limit[i][tt]=1;
					q.push(node{i,tt});
				}
			}
		}
	}
}int main(){int x,y;
//	freopen("house.in","r",stdin);
//	freopen("house.out","w",stdout);
	scanf("%d%d%d",&n,&m,&T);
	for(int i=0;i<T;i++)
		for(int j=1;j<=m;j++){
			scanf("%d%d",&x,&y);
			Map[x][y][i]=Map[y][x][i]=1;//记录是否能到达
	}for(int i=0;i<T;i++)
		for(int j=0;j<=n;j++)
			Map[j][j][i]=1;
	spfa();int res=20021109;
	for(int i=0;i<T;i++)res=min(res,dis[0][i]);//找到到0的最小值
	if(res>=20021109)puts("Poor Z4!");
	else printf("%d",res);
}

阅读更多

没有更多推荐了,返回首页