zoukankan      html  css  js  c++  java
  • POJ 3259 Bellman_Ford算法

    额。关键是读题。反正我是看了解题报告才知道意思的。给你n个点。m条路。双向的。耗费时间。w个虫洞。单向的。时间为负值。问你是否可以从某一点返回看到之前的自己。即为判断是不是有负环。用Bellman_Ford算法。

    分分钟打完。排了好久的bug。还是循环那里j和i傻傻的分不清楚。

    附代码:
    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #define maxn 0x1f1f1f1f
    using namespace std;

    int n, m, w;  //定点数 m+w是边数

    struct Edge
    {
        int u, v, t;
    } edge[6000];
    int low[600];
    int tot;

    bool Bellman_Ford()
    {
        memset(low, maxn, sizeof(maxn));
        //for (int i=2; i<=n; ++i)
           // low[i] = maxn;
        low[1] = 0;
        for (int i=1; i<n; i++)
        {
            bool flag = false;
            for (int j=0; j<tot; ++j)
            {
                if (low[edge[j].v] > low[edge[j].u] + edge[j].t)
                {
                    low[edge[j].v] = low[edge[j].u] + edge[j].t;
                    flag = true;
                }
            }
            if (!flag) break;
        }
        for (int i=0; i<tot; ++i)
        {
            if (low[edge[i].v] > low[edge[i].u] + edge[i].t)
                return true;  // 存在负环
        }
        return false;
    }

    int main()
    {
        int t;
        scanf("%d", &t);
        while (t--)
        {
            scanf("%d%d%d", &n, &m, &w);
            tot = 0;
            int u, v, t;
            for (int i=0; i<m; ++i)
            {
                scanf("%d%d%d", &u, &v, &t);
                edge[tot].u = u;
                edge[tot].v = v;
                edge[tot++].t = t;
                edge[tot].u = v;
                edge[tot].v = u;
                edge[tot++].t = t;
            }
            for (int i=0; i<w; ++i)
            {
                scanf("%d%d%d", &u, &v, &t);
                edge[tot].u = u;
                edge[tot].v = v;
                edge[tot++].t = -t;
            }
            bool flag = Bellman_Ford();
            if (flag) printf("YES ");
            else printf("NO ");
        }
    return 0;
    }

  • 相关阅读:
    1 外部JavaScript
    1 外部JavaScript
    蓝桥杯:位运算
    Java为什么要配置环境变量
    java数组静态复制和动态复制越界问题
    Dijkstra算法java实现
    离散二元关系实验java实现
    Java中字符串split() 的使用方法
    用java编程实现集合的交、并、差和补运算
    61根据字符出现频率排序(451)
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4582268.html
Copyright © 2011-2022 走看看