POJ 3259 Wormholes (spfa判断负权环)

原创 2016年08月30日 20:35:23

题意:

给你一张图,图上有n个点,m条边,w个虫洞。
给你m条边的权值,再给你w个虫洞能回到过去的时间(也就是说是负权的意思)。
问你能不能找到一个环,环上的权值总和是负的。

思路:

spfa,即bellman-ford的队列优化。
我写的这个是用邻接矩阵存的图,时间上感觉不是特别有效率,然而此题并没有卡这些。

AC代码:

#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>

using namespace std;

int dis[510];
int ma[510][510];
bool vis[510];// 是否在队列里
int cnt[510];

bool spfa(int n){
    queue<int> q;
    q.push(1);
    dis[1] = 0;
    cnt[1]++;
    int po;
    while(!q.empty()){
        po = q.front();
        q.pop();
        vis[po] = false;
        for(int i = 1;i <= n;i++){
            if(dis[i] > dis[po] + ma[po][i]){
                dis[i] = dis[po] + ma[po][i];
                if(vis[i] == false){
                    q.push(i);
                    vis[i] = true;
                    cnt[i]++;
                    if(cnt[i] >= n) return true; // 存在负权环
                }
            }
        }
    }
    return false;
}

int main()
{
    int t;
    cin>>t;
    int n,m,w;
    int x,y,z;
    while(t--){
        memset(ma,0x3f3f3f3f,sizeof(ma));
        memset(dis,0x3f3f3f3f,sizeof(dis));
        memset(vis,false,sizeof(vis));
        memset(cnt,0,sizeof(cnt));
        scanf("%d%d%d",&n,&m,&w);
        for(int i = 1;i <= m;i++){
            scanf("%d%d%d",&x,&y,&z);
            ma[x][y] = min(ma[x][y],z);
            ma[y][x] = min(ma[y][x],z);
        }
        for(int i = 1;i <= w;i++){
            scanf("%d%d%d",&x,&y,&z);
            ma[x][y] = min(ma[x][y],-z);
        }
        if(spfa(n))
            puts("YES");
        else
            puts("NO");
    }
    return 0;
}
版权声明:本文为博主原(口)创(胡),未经博主允许不得转载。

相关文章推荐

spfa 有无负权环 负权边最短路 模板

spfa 是利用队列优化的快速bellman-ford的算法,可以判断是否有负权环,如果没有的话可以求出来最短路。...

可以处理负权的单源最短路径的SPFA算法带图详解(自己画的图)

可以处理负权的单源最短路径的SPFA算法带图详解(自己画的图) 分类: 算法2013-11-05 19:15 367人阅读 评论(0) 收藏 举报 SPFA算法 算法大致流程...
  • pi9nc
  • pi9nc
  • 2014年04月04日 15:30
  • 3432

poj3259 Wormholes 最短路 spfa 负权环判断

POJ 3259 题目大意: 就是判断给出的图中是否存在一个负权环,如果有的话,那么这个人转了一圈之后时间总和小于零,代穿越到之前了,也就满足了他。。。 大致思路: 裸的spfa判负权环,如果...

POJ 2983 Is the Information Reliable? (约束差分系统||SPFA判负权环)

题目大意:n个点,m个条信息。P 代表a在b北距离为c,V代表a,在b北至少1 问有没有冲突的信息。思路:根据a-b=c公式我们可以推出a-b=-c,并且a-b>=1 那么对于第一个公式我们可以分...

POJ3259(判断有无负权环)

SPFA找负权环 若迭代次数
  • immiao
  • immiao
  • 2014年05月25日 10:45
  • 536

hdu1317 负权最短路(Floyd+bellman)

首先要读懂题,做这个题时读题看样例琢磨了半天才明白= =; 题目的意思是,一个人从一号房间走到最后一个房间,每个房间有相应的能量值(可正可负),当走到这个房间的时候可以获取这个房间的能量值,如果走到...

POJ - 3259 Wormholes解题报告(SPFA判断负权环)

#include #include #include #include #include #define INF 0x3f3f3f3f using namespace std; struct...

POJ 3259 Wormholes (Bellman-Ford/SPFA 判断是否存在负权环)

题意:要求判断任意两点都能仅通过正边就可互相到达的有向图中是否存在负权环 Bellman-Ford的模板题目。 #include #include using namespace std; ...

POJ 3259 Wormholes SPFA 判断负权回路

Description While exploring his many farms, Farmer John has discovered a number of amazing wormhole...
  • AXuan_K
  • AXuan_K
  • 2014年10月30日 20:31
  • 507

POJ 3259 Wormholes 邻接表的SPFA判断负权回路

一个农民有农场,上面有一些虫洞和路,走虫洞可以回到 T秒前,而路就和平常的一样啦,需要花费时间走过。问该农民可不可能从某个点出发后回到该点,并且于出发时间之前?...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3259 Wormholes (spfa判断负权环)
举报原因:
原因补充:

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