zoukankan      html  css  js  c++  java
  • poj3259 Wormholes【最短路-bellman-负环】

    While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole! Each of FJ's farms comprises N (1 ≤ N ≤ 500) fields conveniently numbered 1..NM (1 ≤ M≤ 2500) paths, and W (1 ≤ W ≤ 200) wormholes.

    As FJ is an avid time-traveling fan, he wants to do the following: start at some field, travel through some paths and wormholes, and return to the starting field a time before his initial departure. Perhaps he will be able to meet himself :) .

    To help FJ find out whether this is possible or not, he will supply you with complete maps to F (1 ≤ F ≤ 5) of his farms. No paths will take longer than 10,000 seconds to travel and no wormhole can bring FJ back in time by more than 10,000 seconds.

    Input
    Line 1: A single integer, FF farm descriptions follow. 
    Line 1 of each farm: Three space-separated integers respectively: NM, and W 
    Lines 2.. M+1 of each farm: Three space-separated numbers ( SET) that describe, respectively: a bidirectional path between S and E that requires T seconds to traverse. Two fields might be connected by more than one path. 
    Lines M+2.. MW+1 of each farm: Three space-separated numbers ( SET) that describe, respectively: A one way path from S to E that also moves the traveler backT seconds.
    Output
    Lines 1.. F: For each farm, output "YES" if FJ can achieve his goal, otherwise output "NO" (do not include the quotes).
    Sample Input
    2
    3 3 1
    1 2 2
    1 3 4
    2 3 1
    3 1 3
    3 2 1
    1 2 3
    2 3 4
    3 1 8
    Sample Output
    NO
    YES
    Hint
    For farm 1, FJ cannot travel back in time. 
    For farm 2, FJ could travel back in time by the cycle 1->2->3->1, arriving back at his starting location 1 second before he leaves. He could start from anywhere on the cycle to accomplish this.

    题意:走一条路会花费时间 走虫洞会时间倒流 问能不能走回起点的时候时间倒流

    思路:其实就是判断有没有环 有环的话

    看题的时候看了半天不知道起点到底是哪一个点

    感觉现在bellman写的还挺顺手的了

    一个加边的addedge函数 一个判断松弛的relax函数 

    然后外面一个for循环遍历n-1次 里面的for循环松弛每一条边

    再对每一条边判断能不能松弛 能就说明有环

    有环其实就说明这个路径上有负的 

    不然干吗要不停的重复走???

    只有可以不断减小才会形成环

    WA了一发是因为加边的时候的cnt没有初始化

    代码:

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<map>
    #include<cstring>
    #include<queue>
    #include<stack>
    #define inf 0x3f3f3f3f
    
    using namespace std;
    
    int f, n, m, w, cnt;
    struct edge{
        int s, e, t;
    }path[5205];
    long long d[505];
    
    void addedge(int s, int e, int t)
    {
        path[cnt].s = s;
        path[cnt].e = e;
        path[cnt].t = t;
        cnt++;
    }
    
    bool relax(int j)
    {
        if(d[path[j].e] > d[path[j].s] + path[j].t){
            d[path[j].e] = d[path[j].s] + path[j].t;
            return true;
        }
        return false;
    }
    
    bool bellman(int sec)
    {
        memset(d, inf, sizeof(d));
        d[sec] = 0;
    
        for(int i = 0; i < n - 1; i++){
            bool flag = false;
            for(int j = 0; j < cnt; j++){
                if(relax(j)) flag = true;
            }
            if(!flag) return false;
        }
    
        for(int i = 0; i < cnt; i++){
            if(relax(i)) return true;
        }
        return false;
    }
    
    int main()
    {
        cin>>f;
        while(f--){
            cin>>n>>m>>w;
            cnt = 0;
            for(int i = 0; i < m; i++){
                int a, b, c;
                cin>>a>>b>>c;
                addedge(a, b, c);
                addedge(b, a, c);
            }
            for(int i = 0; i < w; i++){
                int a, b, c;
                cin>>a>>b>>c;
                addedge(a, b, -c);
            }
    
            if(bellman(1))
                cout<<"YES
    ";
            else
                cout<<"NO
    ";
        }
        return 0;
    }
    


  • 相关阅读:
    取消Win10自动更新?
    Mybatis入门调试错误:Could not find resource XXX
    IDEA导入新Module出现的问题
    WEB-INF目录下的存放包的目录只能命名为lib
    rocketmq 同步刷盘、异步刷盘和同步复制、异步复制
    spring 集成mybatis
    Spring <aop:aspectj-autoproxy proxy-target-class="false|true"/>
    spring中expose-proxy的作用与原理
    分布式事物
    <context:annotation-config/>,<mvc:annotation-driven/>和<context:component-scan>之间的关联
  • 原文地址:https://www.cnblogs.com/wyboooo/p/9643424.html
Copyright © 2011-2022 走看看