Cross the middle
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 36 Solved: 13
Description
n个点的图,给出任意两点之间的距离,m个询问,每次询问Mid是否可能出现在从Start到End的最短路径上。
Input
第一行n,m
接下来是一个n*n的邻接矩阵,w[i][j]表示i到j的距离
接下来m行
每行start,end,mid
N,m<=100,w[i][j]<=100
Output
每个询问对应一行输出
如果可能出现输出Yes,否则No
Sample Input
3 2 0 1 1 1 0 1 1 1 0 1 2 3 1 3 2
Sample Output
No No
HINT
Source
解题思路:若k在i与j之间的最短路径上,只需满足 dis[i][k] + dis[k][j] = dis[i][j] 即可。
AC代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; #define INF 12345678 int a[105][105]; //任意两点间的最短路径长度 int main(){ // freopen("in.txt","r", stdin); int n, m, x, y, t; while(scanf("%d%d", &n, &m)!=EOF){ for(int i=1; i<=n; i++) for(int j=1; j<=n; j++){ scanf("%d", &a[i][j]); if(i == j) a[i][j] = INF; } for(int k=1; k<=n; k++) //Floyd求任两点之间的最短路径 for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) a[i][j] = min(a[i][j], a[i][k] + a[k][j]); for(int j=0; j<m; j++){ scanf("%d%d%d", &x, &y, &t); if(a[x][t] + a[t][y] == a[x][y]) printf("Yes\n"); //判断 else printf("No\n"); } } return 0; } /************************************************************** Problem: 1144 User: sxk Language: C++ Result: Accepted Time:60 ms Memory:1736 kb ****************************************************************/
时间: 2024-10-13 23:27:44