标签:最短路径floyd
错误:傻傻卡在>=上面
海平面上升
TimeLimit:2500MS MemoryLimit:128MB
64-bit integer IO format:%lld
Problem Description
有n个岛m座桥。当海水涨潮时是有些道路会被淹没而导致无法通行。
现在已知每座桥的高度和海平面高度。当海平面高度大于等于桥的高度时,这座桥将无法通行。而任意时刻岛屿都不会被淹没,问某些岛之间是否能够通行。
两个岛之间的桥可能不止一座
Input
每个测试文件仅有一组数据
第一行是三个数组n,m,q。分别代表岛屿数量,桥的数量和查询次数
接下来有m行,每行有三个数字 a,b,h代表岛屿a与岛屿b直接有个一座高度为h的桥。
再接下来有q行,每行有三个数字x, y,h。代表查询当海水高度为h时,x,y之间是否能够通行
n<=200,m<=20000,q<=20000
1<=a,b,x,y<=n 且a!=b,x!=y
0<=h<=1e9
Output
如果能够通行请输出"G0",否则"PlTY"
请注意桥是双向通行的并仔细审题
(注意PlTY的书写)
SampleInput
10 9 5
5 7 76
7 1 30
1 9 96
9 6 16
6 3 61
3 2 86
2 8 28
8 10 82
10 4 1
10 9 29
5 9 75
7 3 5
3 10 47
1 6 62
SampleOutput
PlTY
PlTY
G0
PlTY
PlTY
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define IN 10000000005
using namespace std;
long long e[205][205]= {0},dis[205][205]= {0};
void floyd(int n)
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
dis[i][j] = e[i][j]; //初始化
for(int k = 1; k <= n; k++) //尝试经过 k 个点对每对顶点之间的距离进行更新
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(min(dis[i][k], dis[k][j]) > dis[i][j])
{
dis[i][j] = min(dis[i][k], dis[k][j]);
}
}
}
}
}
int main()
{
int T,m,q,a,b,h,x,y,h2,i,j;
scanf("%d%d%d",&T,&m,&q);
for(i=0; i<m; i++)
{
scanf("%d%d%d",&a,&b,&h);
if(!e[a][b]||e[a][b]<h)
e[a][b]=e[b][a]=h;
}
for(i=1; i<=T; i++)
{
e[i][i]=IN;
}
// for(i=1; i<=T; i++)
// {
// for(j=1; j<=T; j++)
// {
// if(e[i][j]<IN)
// printf("%3d ",e[i][j]);
// else
// printf("--- ");
// }
// printf("\n");
// }
// printf("--------------\n");
floyd(T);
// for(i=1; i<=T; i++)
// {
// for(j=1; j<=T; j++)
// {
// if(dis[i][j]<IN)
// printf("%3d ",dis[i][j]);
// else
// printf("--- ");
// }
// printf("\n");
// }
for(i=0; i<q; i++)
{
scanf("%d%d%d",&x,&y,&h2);
if(h2<dis[x][y])
printf("G0\n");
else
printf("PlTY\n");
}
return 0;
}