【题目描述】
快到WD的生日了。XFZ和LFT都要去送礼物。XFZ生活的国家有n个城市,有些城市之间有直达的高速公路。WD喜欢的礼物只在其中的m个城市出售。给你XFZ和LFT通过各条高速公路的速度,求出先到WD所在城市的人和时间。
XFZ和LFT都生活在1号城市,WD生活在n号城市。
【输入格式】
第1行三个数:n、m、k:k表示高速公路的数量。
第2行m个数:出售WD喜欢的礼物的城市编号。
第3~k+2行每行四个数:一条高速公路的起点、终点、XFZ通过这条高速公路的时间和LFT通过这条高速公路的时间。
【输出格式】
若两个人都到不了WD所在的城市或者买不到WD喜欢的礼物,输出”fail!”;
若XFZ不比LFT晚到,输出”XFZ”和他所需的时间;
否则输出”LFT”和他所需的时间。
【样例输入】
3 2 2
1 3
1 2 3 5
2 3 4 3
【样例输出】
XFZ 7
【数据范围】
对于30%的数据:n≤5,k≤10,每个城市都有礼物出售。
对于50%的数据:n≤10,m≤5,k≤20。
对于100%的数据:n≤200,m≤100,k≤500。
代码
#include<bits/stdc++.h>
#define FOR(i,j,k) for(int i=(j);i<=(k);i++)
using namespace std;
int f1[201][201],f2[201][201];
int g[101];
int n,m,k;
int XFZ=1e9,LFT=1e9;
inline int read()
{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int main()
{
freopen("gift.in","r",stdin);
freopen("gift.out","w",stdout);
n=read(),m=read(),k=read();
for(int i=1;i<=m;i++)
g[i]=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f1[i][j]=f2[i][j]=1e9;
for(int i=1;i<=k;i++)
{
int u=read(),v=read();
f1[u][v]=read(),f2[u][v]=read();
}
for(int i=1;i<=n;i++)
f1[i][i]=f2[i][i]=0;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f1[i][j]=min(f1[i][j],f1[i][k]+f1[k][j]),f2[i][j]=min(f2[i][j],f2[i][k]+f2[k][j]);
for(int i=1;i<=m;i++)
{
XFZ=min(XFZ,f1[1][g[i]]+f1[g[i]][n]);
LFT=min(LFT,f2[1][g[i]]+f2[g[i]][n]);
}
if(XFZ==LFT==1e9)
{
puts("fail!");
return 0;
}
if(XFZ<=LFT)
printf("XFZ %d
",XFZ);
else
printf("LFT %d
",LFT);
return 0;
}