【最短路】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!”。

【输入样例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结果完全忽略在原地不动的等待时间,而样例又阴险地没有设这样的数据,于是华丽挂……正解是很巧妙的bell-man,在松弛每一条边的同时计算等待时间找最短路。

 

二、解决问题

Bell-man+等待时间更新计算

Tips:加1减1什么的很烦人啊,把dis[]理解为时刻更清晰一些

三、代码实现

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 using namespace std;
 5 const int A=10000*2*10+20,B=85,C=11,inf=5e8;
 6
 7 int n,m,t,st,en,tmp,h;
 8 int i,j,x,y,k,z;
 9 int sum,ex[B],dis[B],pre[B];
10 bool bo[B][B];
11 char ch;
12 struct edge{
13     int from,to,nxt,era;
14 }e[A];
15
16 void build(int a,int x,int y)
17 {
18     ++sum;
19     e[sum].to=y;
20     e[sum].from=x;
21     e[sum].era=a;
22 }
23
24 void read(int &w)
25 {
26     w=0;
27     ch=getchar();
28     while(ch>‘9‘||ch<‘0‘)ch=getchar();
29     while(ch>=‘0‘&&ch<=‘9‘)
30     {
31         w=w*10+ch-‘0‘;
32         ch=getchar();
33     }
34 }
35
36 int wait(int x,int d)
37 {
38     int p=d%t;if(!p)p=t;
39     if(p==e[x].era)return 0;
40     for(k=1;k<=t;++k)
41     {
42         p=(d+k)%t;if(!p)p=t;
43         if(p==e[x].era)return k;
44     }
45 }
46
47 void bell()
48 {
49     for(i=0;i<=n;++i)dis[i]=inf;
50     dis[1]=1;
51     for(i=1;i<=n;++i)
52         for(j=1;j<=m;++j)
53         {
54             if(dis[e[j].from]!=inf)
55             {
56                 tmp=wait(j,dis[e[j].from]);
57                 if(dis[e[j].from]+tmp+1<dis[e[j].to])
58                 dis[e[j].to]=dis[e[j].from]+tmp+1;
59             }
60         }
61 }
62
63 int main()
64 {
65     read(n);
66     read(m);
67     read(t);
68     for(i=1;i<=t;++i)
69     {
70         memset(bo,0,sizeof(bo));
71         for(j=1;j<=m;++j)
72         {
73             read(x);
74             read(y);
75             if(!bo[x][y])
76             {
77                 bo[x][y]=1;
78                 build(i,x,y);
79                 build(i,y,x);
80             }
81         }
82     }
83     m*=(2*t);
84
85     bell();
86
87     if(dis[0]==inf)printf("Poor Z4!\n");
88     else    printf("%d\n",dis[0]-1);
89     return 0;
90 }
时间: 2024-08-26 00:50:28

【最短路】House的相关文章

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)

//转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define MAX 105 int lim, n; int p[M

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

hdu4725 拆点+最短路

题意:有 n 个点,每个点有它所在的层数,最多有 n 层,相邻两层之间的点可以互相到达,消耗 c (但同一层并不能直接到达),然后还有一些额外的路径,可以在两点间互相到达,并且消耗一定费用.问 1 点到 n 点的最小花费 将每一层拆成两个点,分别为进入层和出发层,然后相邻层的出发层可以指向进入层,花费 c,每个点可以到达其出发层,而进入层可以到达该点,花费 0 ,最后建立其余双向边,最短路 1 #include<stdio.h> 2 #include<string.h> 3 #in

hdu3416 最短路+最大流

题意:有 n 点 m 边,有出发点 A 到达点 B ,只允许走原图中的最短路,但每条边只允许被走一次,问最多能找出多少条边不重复的最短路 一开始做到的时候瞎做了一发最短路,WA了之后也知道显然不对,就放着了,后来打了今年的多校,再做到的时候发现和多校第一场的1007一样的……最短路+网络流就行了,只不过第一次做这个的时候我还不知道网络流是啥,不会做也正常啦. 首先对于原图跑一遍最短路求出每个点距离 A 点的最短路,然后对于每一条边,如果它的权值等于它连接的两点的最短路的差值的时候,就说明这条路是

【啊哈!算法】算法7:Dijkstra最短路算法

上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图中的1号顶点到2.3.4.5.6号顶点的最短路径. <ignore_js_op> 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下. <ignore_js_op> 我们还需要用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下.

HDU ACM 2544 最短路-&gt;最短路

最短路,简单题,floyd实现,在求最短路时一定要是是最大节点编号maxnum而不是输入的n,否则是错的. #include<iostream> using namespace std; int map[105][105]; //无向图 void Init() { int MAX=1000000,i,j; for(i=1;i<=104;i++) for(j=1;j<=104;j++) if(i==j) map[i][j]=0; else map[i][j]=MAX; } void

POJ 1135 Domino Effect(最短路 多米诺骨牌)

题意 题目描述: 你知道多米诺骨牌除了用来玩多米诺骨牌游戏外,还有其他用途吗?多米诺骨牌游戏:取一 些多米诺骨牌,竖着排成连续的一行,两张骨牌之间只有很短的空隙.如果排列得很好,当你推 倒第 1张骨牌,会使其他骨牌连续地倒下(这就是短语"多米诺效应"的由来). 然而当骨牌数量很少时,这种玩法就没多大意思了,所以一些人在 80 年代早期开创了另一个 极端的多米诺骨牌游戏:用上百万张不同颜色.不同材料的骨牌拼成一幅复杂的图案.他们开创 了一种流行的艺术.在这种骨牌游戏中,通常有多行骨牌同时