礼物

【题目描述】
快到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\n",XFZ);
	else
		printf("LFT %d\n",LFT);
	return 0;
}

posted @ 2020-07-29 17:01  牛大了的牛大  阅读(122)  评论(0编辑  收藏  举报