n个点的图,给出任意两点之间的距离,m个询问,每次询问Mid是否可能出现在从Start到End的最短路径上。
标签:des style http io ar color os sp for
n个点的图,给出任意两点之间的距离,m个询问,每次询问Mid是否可能出现在从Start到End的最短路径上。
第一行n,m
接下来是一个n*n的邻接矩阵,w[i][j]表示i到j的距离
接下来m行
每行start,end,mid
N,m<=100,w[i][j]<=100
每个询问对应一行输出
如果可能出现输出Yes,否则No
3 2
0 1 1
1 0 1
1 1 0
1 2 3
1 3 2
No
No
解题思路:若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
****************************************************************/
2014东北农大校赛--D.Cross the middle (任意两点最短路径 Floyd)
标签:des style http io ar color os sp for
原文地址:http://blog.csdn.net/u013446688/article/details/41356147