poj3259 Wormholes(floyd||spfa判断负环)

原创 2016年05月31日 21:05:34


http://poj.org/problem?id=3259

题意:n个点,m个正权边,w个负权边,正权边为双向,负权边为单向,判断是否有负环。


思路:首先知道何为负环,例如有3个点编号1,2,3,任意两点之间都存在一条边,那么1,2,3存在一个环,其上权值和为负即为负环。floyd和spfa两种做法,floyd法卡的时间紧,不但要把min改成普通判断,输出也不能在函数内。整体来说floyd太容易超时了,判环条件就是判断对角线上的点,如果有负值,说明松弛过程中又回到了原来的点且更新比0小。spfa的判环条件就是某个点进入队列的次数超过n次,则存在负环(spfa无法处理带负环的图)。而dijkstra无法判断。


#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <queue>

using namespace std;

typedef long long LL;

const int N = 600;
const int INF = 0x3f3f3f3f;

int G[N][N], dis[N], num[N], n, s;
bool vis[N];

int floyd()
{
    for(int k = 1; k <= n; k++)
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)
            {
        //        G[i][j] = min(G[i][j], G[i][k]+G[k][j]);
                if(G[i][k]+G[k][j] < G[i][j])
                    G[i][j] = G[i][k]+G[k][j];
            }
            if(G[i][i] < 0) return 1;
        }
    return 0;
}

int spfa()
{
    queue<int>que;
    for(int i = 1; i <= n; i++)
    {
        dis[i] = INF;
        num[i] = 0;
    }
    dis[1] = 0;
    vis[1] = true;
    que.push(1);
    while(!que.empty())
    {
        int now = que.front();
        que.pop();
        vis[now] = false;//记得还原!!
        for(int i = 1; i <= n; i++)
        {
            if(dis[now]+G[now][i]<dis[i])
            {
                dis[i] = dis[now]+G[now][i];
                if(!vis[i])
                {
                    vis[i] = true;
                    num[i]++;
                    if(num[i] > n) return 1;
                    que.push(i);
                }
            }
        }
    }
    return 0;
}

int main()
{
  //  freopen("in.txt", "r", stdin);
    int f, m, e, w, t;
    scanf("%d", &f);
    while(f--)
    {
        scanf("%d%d%d", &n, &m, &w);
        memset(vis, 0, sizeof(vis));
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
            {
                if(i == j) G[i][j] = 0;
                else G[i][j] = INF;
            }
        for(int i = 1; i <= m; i++)
        {
            scanf("%d%d%d", &s, &e, &t);
            if(t < G[s][e]) G[s][e] = G[e][s] = t;
        }
        for(int i = 1; i <= w; i++)
        {
            scanf("%d%d%d", &s, &e, &t);
            G[s][e] = -t;
        }
        int ans = floyd();
      //  int ans = spfa();
        if(ans) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

poj3259 Wormholes floyd求负环

POJ 3259 农夫约翰在探索他的许多农场,发现了一些惊人的虫洞。虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M...
  • yslcl12345
  • yslcl12345
  • 2016年01月24日 12:08
  • 2646

POJ3259----Wormholes(SPFA判断负环)

判断给定的有向图中是否存在负环。       利用 spfa 算法判断负环有两种方法:       1) spfa 的 dfs 形式,判断条件是存在一点在一条路径上出现多次。    ...
  • hy1405430407
  • hy1405430407
  • 2016年04月07日 20:58
  • 1292

POJ 3259 Wormholes(SPFA算法判断是否存在负环)

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 36755   Accepted: 13457...
  • zwj1452267376
  • zwj1452267376
  • 2015年08月19日 21:03
  • 774

Bellman_Ford和Spfa两种方法判断负环

Bellman_Ford是通过N-1次循环求出每个点到原点的最短路的,每次循环遍历所有的边,如果能更新就更新。前面说过为什么N-1次就行(若一个点到起点的最短路需要经过N个点,包括他自己,那么第N次循...
  • corncsd
  • corncsd
  • 2014年01月17日 17:09
  • 581

用SPFA判断负环的方法及其优化

判负环的优化
  • wyh0410
  • wyh0410
  • 2016年11月03日 15:40
  • 2786

POJ3259 Wormholes 【SPFA判断负环】

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 32111   Accepted: 11662...
  • u012846486
  • u012846486
  • 2014年12月08日 11:09
  • 711

poj3259 Wormholes spfa/Floyd判负环

题意: 给你NN个点,M+WM+W条有向边,并且给你M+WM+W条边的起点uu,终点vv,和权值ww。其中MM条边的权值为正,WW条边的权值为负。 让你判断所给的图是否含有负权环。 要注意题目给...
  • Ksyer_
  • Ksyer_
  • 2018年01月13日 00:21
  • 10

poj3259 - Wormholes

想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410                              ...
  • wangjian8006
  • wangjian8006
  • 2012年08月16日 10:10
  • 5628

easy sssp(spfa判断负环)

easy sssp描述: 输入数据给出一个有N(2
  • cax1165
  • cax1165
  • 2016年08月05日 17:57
  • 580

POJ3259 Wormholes(spfa判断负环模板题)

Description While exploring his many farms, Farmer John has discovered a number of amazing wormhol...
  • qq_34374664
  • qq_34374664
  • 2016年09月09日 18:33
  • 323
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj3259 Wormholes(floyd||spfa判断负环)
举报原因:
原因补充:

(最多只允许输入30个字)