HLJUOJ1144(Dijkstra模板应用)

来源:互联网 发布:wemall商业版java源码 编辑:程序博客网 时间:2024/05/29 13:21

1144: D.Cross the middle

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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 20 1 11 0 11 1 01 2 31 3 2

Sample Output

NoNo
解题思路:
a到b最短路如果中间路过mind,那么a到mnind的最短路 + mind到b的最短路 == a 到 b的最短路,模板应用,数据小,大的话可以卡下Floyd
完整代码:
#include <functional>#include <algorithm>#include <iostream>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cstring>#include <climits>#include <cassert>#include <complex>#include <cstdio>#include <string>#include <vector>#include <bitset>#include <queue>#include <stack>#include <cmath>#include <ctime>#include <list>#include <set>#include <map>using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")typedef long long LL;typedef double DB;typedef unsigned uint;typedef unsigned long long uLL;/** Constant List .. **/ //{const int MOD = int(1e9)+7;const int INF = 0x3f3f3f3f;const LL INFF = 0x3f3f3f3f3f3f3f3fLL;const DB EPS = 1e-9;const DB OO = 1e20;const DB PI = acos(-1.0); //M_PI;int n , m;const int maxn = 1111;int maps[maxn][maxn];int vis[maxn] , dis[maxn];int dijkstra(int x , int y){    int i , k , minn;    for(i = 1 ; i <= n ; i ++)    {        vis[i] = 0;        dis[i] = maps[x][i];    }    vis[x] = 1;    do{        minn = INF;        k = 0;        for(i = 1 ; i <= n ; i ++)        {            if(vis[i] == 0 && dis[i] < minn)            {                minn = dis[i];                k = i;            }        }        if(k)        {            vis[k] = 1;            for(i = 1; i <= n ; i ++)            {                if(maps[k][i] < INF && minn + maps[k][i] < dis[i])                {                    dis[i] = minn + maps[k][i];                }            }        }    }while(k);    return dis[y];}int main(){    #ifdef DoubleQ    freopen("in.txt","r",stdin);    #endif    while(~scanf("%d%d",&n,&m))    {        for(int i = 1 ; i <= n ; i ++)        {            for(int j = 1 ; j <= n ; j ++)            {                scanf("%d",&maps[i][j]);            }        }        while(m--)        {            int s , e , mind;            scanf("%d%d%d",&s , &e , &mind);            int cnt1 = dijkstra(s , mind);            int cnt2 = dijkstra(mind , e);            int sum = dijkstra(s , e);            if(cnt1 + cnt2 == sum)                printf("Yes\n");            else                printf("No\n");        }    }}


0 0