Problem H: 网络连接中断
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 100 Solved: 16
[ Submit][ Status][ Web Board]
Description
为了让同学们好好休息第二天能准时起床参加早自习,重庆游戏与电子竞技大学会在每天晚上24点断网。这天晚上23:59:59,小胡打完游戏正准备去睡觉,突然发现自己还没跟女朋友说晚安,瞬间吓出一身冷汗。幸好,并不是所有楼栋都是同时断网,最多存在一分钟的误差。旺盛的求生欲促使小胡在24:00:00发出了那条”晚安”,吃瓜群众们想知道,这条”晚安”有没有可能到达他的女朋友那。
Input
每个输入包含一个测试用例。每个测试的第一行包括两个正整数,楼栋总数N(2<=N<=1000)和网络条数M(1<=M<=500000)。楼栋的编号从1到N。接下来的一行,包括N个整数,第i个数字表示i号楼的断网时间ti(0<=ti<=60),即从第ti秒起(不包括ti秒这个瞬间),和i楼栋有关的网络全部失效。接下来的M行,每行包括两个正整数,一条网络连接的两个楼栋。网络是双向的。接下来的一行包括两个正整数,表示小胡的楼栋u和小胡女朋友的楼栋v。小胡的信息在第0秒从楼栋u出发,在相连的两个楼栋间传播需要1秒。
Output
如果小胡的信息能到达女朋友的楼栋,输出”Nice!”。否则,输出”GG”。
Sample Input
3 2
1 2 2
1 2
2 3
1 3
Sample Output
Nice!
HINT
题解:基础的bfs,只是要在判断能否到达的基础上还要满足到达的时间小于该点的断网时间。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int main()
{
int cutt[maxn];
int arv[maxn];
bool mp[maxn][maxn];
int N,M;
int x,y;
int u,v;
queue<int> q;
while(scanf("%d%d",&N,&M) != EOF)
{
for(int i = 1;i <= N;i++)
{
arv[i] = -1;
scanf("%d",&cutt[i]);
}
for(int i = 0;i < M;i++)
{
scanf("%d%d",&x,&y);
mp[x][y] = mp[y][x] = 1;
}
scanf("%d%d",&u,&v);
arv[u] = 0;
q.push(u);
while(q.size())
{
x = q.front();
q.pop();
for(int i = 1;i <= N;i++)
{
if(mp[x][i] && arv[x] + 1 <= cutt[i] && arv[x] + 1 <= cutt[x] && arv[i] == -1)
{
arv[i] = arv[x] + 1;
q.push(i);
}
}
}
if(arv[v] == -1)
{
printf("GG\n");
}
else
{
printf("Nice!\n");
}
}
return 0;
}