首页 > 代码库 > 2014东北农大校赛--D.Cross the middle (任意两点最短路径 Floyd)
2014东北农大校赛--D.Cross the middle (任意两点最短路径 Floyd)
Cross the middle
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 36 Solved: 13
[Submit][Status][Web Board]
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
2014农大校赛
解题思路:若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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。