关闭

poj 3259 bellman-ford算法 判断是否存在负权回路

157人阅读 评论(0) 收藏 举报
分类:
Wormholes
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 41838   Accepted: 15364

Description

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..M+W+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 back T 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.

Source

USACO 2006 December Gold

题目大意:虫洞问题,现在有n个点,m条边,代表现在可以走的通路,比如从a到b和从b到a需要花费c时间,现在在地上出现了w个虫洞,虫洞的意义就是你从a到b花费的时间是-c(时间倒流,并且虫洞是单向的),现在问你从某个点开始走,能回到你从此点出发的从前,传说中的月光宝盒~ 看看至尊宝能否救下白骨精~~醉了~

解题思路:其实给出了坐标,这个时候就可以构成一张图,然后将回到从前理解为是否会出现负权环,用bellman-ford就可以解出了

bellman-ford的模版~


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;

#define INF 0x3f3f3f3f
#define N 1100
int n,m,w,tol;
struct node
{
    int s,e,t;
}p[5100];

int bellman()
{
    int i,j,dis[N];
    for(i=1;i<=n;i++)
    {
        dis[i]=(i==1)?0:INF;
    }

    for(i=0;i<=n-1;i++)
    {
        int f=0;
        for(j=0;j<tol;j++)
        {
            if(dis[p[j].e]>dis[p[j].s]+p[j].t)
            {
                dis[p[j].e]=dis[p[j].s]+p[j].t;
                f=1;
            }
        }
        if(f==0)
           break;
    }

    for(i=0;i<tol;i++)
    {
        if(dis[p[i].e]>dis[p[i].s]+p[i].t)
            return 1;
    }
    return 0;
}

int main()
{
    int T,a,b,c,i;
    scanf("%d",&T);
    while(T--)
    {
        tol=0;
        scanf("%d%d%d",&n,&m,&w);
        for(i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            p[tol].s=a;
            p[tol].e=b;
            p[tol].t=c;
            tol++;
            p[tol].s=b;
            p[tol].e=a;
            p[tol].t=c;
            tol++;
        }
        for(i=1;i<=w;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            p[tol].s=a;
            p[tol].e=b;
            p[tol].t=-c;
            tol++;
        }
        if(bellman())
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}


0
0
查看评论

POJ - 3259 Wormholes解题报告(Bellman-Ford判断有向图中是否有负权环)

题目大意:一个有向图,给你n个点,m条双向路径,以及t条虫洞。每条路径描述在两个点ab之间移动需要时间v。每条虫洞描述从a到b需要时间-v(类似于时空穿越)。现在就问你,一个人能否从某个点开始,通过若干次虫洞和路径,在他出发之前的每个时刻回到出发点。注意:两个点之间有可能有多条路径!分析:相当于找一...
  • qq_36306833
  • qq_36306833
  • 2017-04-21 11:46
  • 201

bellman-ford算法——最短路问题,判断是否存在负权回路或正权回路

转载链接:http://www.wutianqi.com/?p=1912 Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。 这时候,就需要使用其他的算法来求解...
  • ZQUSwansea
  • ZQUSwansea
  • 2015-11-09 10:37
  • 1099

poj 3259 bellman-ford判断是否存在负权回路

// // main.cpp // poj3259 // // Created by Fangpin on 15/5/28. // Copyright (c) 2015年 FangPin. All rights reserved. // #include #include #inclu...
  • FANGPINLEI
  • FANGPINLEI
  • 2015-05-28 21:42
  • 658

最短路径(三)—Bellman-Ford算法(解决负权边)

前两节我们写了Floyd-Warshall算法http://blog.csdn.net/wtyvhreal/article/details/43315705和 Dijkstra算法http://blog.csdn.net/wtyvhreal/article/details/43447497 ...
  • wtyvhreal
  • wtyvhreal
  • 2015-02-03 15:45
  • 4051

Bellman-Ford算法—求解带负权边的最短路径

1.Dijkstra不能得到含有负权边图(这里就不是环路了)的单源最短路径 Dijkstra由于是贪心的,每次都找一个距源点最近的点(dmin),然后将该距离定为这个点到源点的最短路径(d[i] 比如上图:1—>2权值为5,1—>3权值为6,3—>2权值为-2,求1到2的最短...
  • LANGQING12345
  • LANGQING12345
  • 2015-03-25 19:19
  • 842

POJ 3259 判断图中是否存在负权回路

#include #include using namespace std; struct Edge { int s; int e; int t; }; static const int MAX = 30000; static const int MAXEDGES = 6000; /*...
  • ych_ding
  • ych_ding
  • 2013-09-03 21:49
  • 1036

POJ 3259(负权回路)

注意普通路径是双向的 program P3259; var f,n,m,w,i,j:longint; s,e,t:longint; map:array[1..2500,1..3] of longint; wmap:array[1..300,1..3] of long...
  • nike0good
  • nike0good
  • 2012-08-18 12:20
  • 1101

图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路)Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;

首先了解松弛技术,即给每个顶点设置到源点的最短距离,设置前驱.  在有限次的对边的松弛之后,可以将所有顶点的前驱与单源最短距离确定.   拓扑排序: 图的深度优先遍历的应用,对一个图进行深度优先的最后将该顶点头插到线性表中,那么线性表中只有自左至右的边,有边的两个的顶...
  • u012116229
  • u012116229
  • 2015-03-10 17:14
  • 617

POJ 3259 SPFA判断负权回路

SPFA 是bellman-ford的一种优化 SPFA 用于求负权存在的最短路,判断是否有负权回路,只需判断松弛边的次数,如果大于N,就说明存在负权回路   #include #include #include #include #include #include #define ...
  • lentty1452
  • lentty1452
  • 2012-07-28 22:33
  • 771

POJ 3259 Wormholes(判断负权回路|SPFA||Bellman-Ford)

//判断是否存在负权回路SPFA算法 #include #include #define MAXN 505 #define MAXM 6000 #define INF 1000000000 using namespace std; int F,N,M,WW,m,u,v,w; int ...
  • ChinaCzy
  • ChinaCzy
  • 2010-07-26 19:24
  • 1197
    个人资料
    • 访问:90831次
    • 积分:3570
    • 等级:
    • 排名:第10950名
    • 原创:274篇
    • 转载:16篇
    • 译文:0篇
    • 评论:32条
    最新评论