您的位置:首页 > 其它

SSL-ZYC 1624 小萨的烦恼

2018-01-11 16:06 211 查看
题目大意:

小萨要从第一个点走到地m个点,有些点可以走,而有些点却不能走。每一条路所需要的时间为2*这条路的距离,其中可以选择任意一条路“加速”到时间只要这条路的距离。请问能否在t的时间内回到第一个点?

思路:

这道题就是一个最短路径问题我们把从i到j不加速的最少时间记为f[i][j][1],加速的时间为f[i][j][2],则最终判断f[i][j][2]*2(要往返)是否小于t即可。

代码:

#include <iostream>
#include <cstdio>
using namespace std;
int f[101][101][3],a[101][101],n,m,t;

int main()
{
scanf("%d%d%d",&n,&t,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
if (a[i][j]==0) a[i][j]=9999999;
f[i][j][1]=a[i][j]*2;  //初始化
f[i][j][2]=a[i][j];  //初始化
}
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
f[i][j][1]=min(f[i][k][1]+f[k][j][1],f[i][j][1]);
f[i][j][2]=min(f[i][k][2]+f[k][j][1],f[i][j][2]);
f[i][j][2]=min(f[i][k][1]+f[k][j][2],f[i][j][2]);  //寻找最短路径
}
if (f[1][m][2]*2>t) printf("You are day dreaming!");  //输出
else printf("%d\n",f[1][m][2]*2);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: