• POJ 3259 Wormholes


    题意:FJ发现了许多虫洞,通过虫洞可以使时光倒流,通过普通的路时间增加,给出一张有向带负权图,问FJ能不能从某一点出发回到这一点时回到了过去。

    解法:Bellman-Ford判负环。先做n-1次松弛,得到最多用n-1条边时从源点到每一个点的最短路径,如果再做一次松弛还可以减少路径长度,说明有负环。

    代码:

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string>
    #include<string.h>
    #include<math.h>
    #include<limits.h>
    #include<time.h>
    #include<stdlib.h>
    #include<map>
    #include<queue>
    #include<set>
    #include<stack>
    #include<vector>
    #define LL long long
    
    using namespace std;
    
    struct node
    {
        int u, v, value;
        node(int u, int v, int value) : u(u), v(v), value(value) {}
        node() {}
    } edge[5300];
    int n, m, w, cnt;
    int dis[505];
    const int inf = 0x3f3f3f3f;
    bool BellmanFord()
    {
        memset(dis, inf, sizeof dis);
        dis[1] = 0;
        for(int i = 0; i < n - 1; i++)
            for(int j = 0; j < cnt; j++)
                dis[edge[j].v] = min(dis[edge[j].u] + edge[j].value, dis[edge[j].v]);
        for(int i = 0; i < cnt; i++)
        {
            if(dis[edge[i].v] > dis[edge[i].u] + edge[i].value)
                return 1;
        }
        return 0;
    }
    int main()
    {
        int T;
        while(~scanf("%d", &T))
        {
            while(T--)
            {
                cnt = 0;
                scanf("%d%d%d", &n, &m, &w);
                for(int i = 0; i < m; i++)
                {
                    int u, v, value;
                    scanf("%d%d%d", &u, &v, &value);
                    edge[cnt++] = node(u, v, value);
                    edge[cnt++] = node(v, u, value);
                }
                for(int i = 0; i < w; i++)
                {
                    int u, v, value;
                    scanf("%d%d%d", &u, &v, &value);
                    edge[cnt++] = node(u, v, -value);
                }
                if(BellmanFord())
                    puts("YES");
                else
                    puts("NO");
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    Android开发新手学习总结(六)——android开发目录结构【图文版】
    Android开发新手学习总结(一)——使用Android Studio搭建Android集成开发环境
    62个Android Studio小技巧合集
    Android Studio 入门指南
    Unity操作
    Unity的安装和破解
    pb数据窗口设置操作
    Roll A Ball
    c实现旋转数列
    用循环添加多行、多列视图
  • 原文地址:https://www.cnblogs.com/Apro/p/4604567.html
Copyright © 2020-2023  润新知