空中楼阁 ( House )

话说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的第一行包括三个整数n(1<=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!”。

样例输入:

4 5 2
1 2
1 3
1 4
2 0
4 0

1 3
1 3
2 3
4 3
3 0

样例输出:

2

数据范围:

见题目

时间限制:

1000

 
这是一道变形了的最短路,要保存不同周期状态下的路,注意处理时间(一开始是1),还要注意路是nT+i(n=0,1,2,…;i=1,2,…,T)
 #include<iostream>
 #include<cstdio>
 #include<cstring>
 using namespace std;
 ;
 ][],next[][*N],des[][*N],size[],T;
 int used[N],dis[N];
 inline void unite(int x,int y,int st)
 {
     des[st][++size[st]]=y;
     next[st][size[st]]=first[st][x];
     first[st][x]=size[st];
     return;
 }
 inline void dfs(int cur,int t,int wait)
 {
     used[cur]=;
     int x=t%T;
     ) x=T;
     ,wait+);
     for(int i=first[x][cur];i;i=next[x][i])
     {
         <dis[des[x][i]])
         {
             dis[des[x][i]]=t+;
             ,);
         }
     }
     used[cur]=;
     return;
 }
 int main()
 {
     memset(dis,,sizeof(dis));
     dis[]=;
     ];
     scanf("%d%d%d",&n,&m,&T);
     ;i<=T;i++)
         ;j<=m;j++)
         {
             scanf("%d%d",&x,&y);
             unite(x,y,i);
             unite(y,x,i);
         }
     dfs(,,);
     ]<haveans) printf(]-);
     else printf("Poor Z4!\n");
     ;
 }
05-11 13:43