题目
一个图,只有一次快速的机会,不快速就得花双倍价格,求点1到点s的最短路,然后*2输出
输入
第一行有三个整数N、T、S
接下来是一个N*N的邻接矩阵。两点之间的距离不超过10^9。A[i,j]为0表示i和j不连通。
4 5 4
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
输出
若最短路大于T,那么输出“You are day dreaming!”(不包括引号)
否则,输出最短路。
2
解题思路
用a[i][j][0]表示没有坐车,用a[i][j][1]表示已经做了车。然后Floyd法。
代码
#include<cstdio>
#include<iostream>
using namespace std;
int n,t,s;
long long car[101][101],a[101][101][2];
int main()
{scanf("%d%d%d",&n,&t,&s);for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){scanf("%d",&car[i][j]);if (car[i][j]==0) car[i][j]=2147483647;a[i][j][0]=car[i][j]*2;//两点之间走路a[i][j][1]=car[i][j];//快速}} for (int k=1;k<=n;k++)for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)if (i!=j){a[i][j][1]=min(a[i][j][1],min(a[i][k][1]+a[k][j][0],a[i][k][0]+a[k][j][1]));//两点之间表示坐车a[i][j][0]=min(a[i][j][0],a[i][k][0]+a[k][j][0]);//两点之间走路} a[1][s][1]*=2;//乘2输出if (a[1][s][1]>t) printf("You are day dreaming!");//大于telse printf("%lld",a[1][s][1]);//否则
}