zoukankan      html  css  js  c++  java
  • SDUT2622 最短路(spfa)

    题目链接

    题目:

    最短路径

    题目描述

    为了准备一年一度的校赛,大家都在忙着往赛场搬运东西,比如气球什么的。这时 YY 也没有闲着,他也加入了搬运工的行列。已知学校有 个路口和 条路,YY 并不是把东西直接搬到赛场,而是从 路口搬运到 路口。由于 YY 非常懒而且他有轻度强迫症。所以他要走的路需要尽可能的短,并且走路径 的倍数。

    输入

     

    输入的第一行为一个正整数T(1  T  20),代表测试数据组数。

    对于每组测试数据:

    输入的第一行为两个正整数  M N  100, 1  M  10000)。

    接下来M行每行三个正整数 UVW0  UV < N, 0  W  230 ),代表有一条从UV的长度为W有向路径

    最后一行为三个正整数SX ST N, 1   10)。

    输出

     

    对于每组测试数据,输出满足条件的从  的最短路径。如果从  不可达,或者无法满足路径数是 的倍数,输出No Answer!”(不包含引号)

    注意:64-bit 整型请使用 long long 来定义,并且使用 %lld  cincout 来输入输出,请不要使用 __int64  %I64d

    示例输入

    2
    2 1
    0 1 1
    0 1 2
    3 2
    0 1 1
    1 2 1
    0 2 2

    示例输出

    No Answer!
    2

    分析:

    对于每个点,都存在 x 种情况, 即对 x 取余 余0(即整除)、 余2、 余3、...、余x-1。例如对于1点,有d[1][0], d[1][1], d[1][2]....

    每走一步要在原来的路径数上加1。

    关于最短路的求法就和原来一样。

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <stack>
    #include <vector>
    #include <queue>
    
    using namespace std;
    
    const long long maxn = 102;
    
    struct edge{
        int v;
        long long w;
    };
    
    long long d[maxn][11];
    int n, m, x;
    bool vis[maxn];
    vector<edge> G[maxn];
    
    void spfa(int v0){
        memset(d, -1, sizeof(d));
        memset(vis, false, sizeof(vis));
    
        queue<int> q;
    
        q.push(v0);
        d[v0][0] = 0;
        vis[v0] = true;
    
        while(!q.empty()){
            int u = q.front();
            q.pop();
            vis[u] = false;
            for(int i=0; i<G[u].size(); i++){
                int v = G[u][i].v;
                long long w = G[u][i].w;
                for(int i=0; i<x; i++) if(d[u][i] != -1){
                    if(d[v][(i+1)%x] == -1 || d[u][i] + w < d[v][(i+1)%x]){
                        d[v][(i+1)%x] = d[u][i] + w;
                        if(!vis[v]){
                            q.push(v);
                            vis[v] = true;
                        }
                    }
                }
            }
        }
    }
    
    int main(){
        int T, s, t;
        cin>>T;
        while(T--){
            cin>>n>>m;
    
            for(int i=0; i<n; i++) G[i].clear();
    
            for(int i=0; i<m; i++){
                int u, v; long long w;
                cin>>u>>v>>w;
                edge e;
                e.v = v; e.w = w;
                G[u].push_back(e);
            }
    
            cin>>s>>t>>x;
            spfa(s);
    
            if(d[t][0] == -1) printf("No Answer!\n");
            else cout<<d[t][0]<<endl;
        }
    
        return 0;
    }
  • 相关阅读:
    poj 2226 Muddy Fields(最小点覆盖)
    hdu 5093 Battle ships(二分图最大匹配)
    poj 3020 Antenna Placement(二分图最大匹配)
    poj 3041 Asteroids(最小点覆盖)
    二分图的一些定理
    hdu 1083 Courses(二分图最大匹配)
    二分图最大匹配模板
    hdu 5094 Maze (BFS+状压)
    hdu 5092 Seam Carving (简单数塔DP,题没读懂,,不过可以分析样例)
    hdu 5090 Game with Pearls (额,, 想法题吧 / 二分图最大匹配也可做)
  • 原文地址:https://www.cnblogs.com/tanhehe/p/3073875.html
Copyright © 2011-2022 走看看