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;
}
版权声明:本文为博主原(口)创(胡),未经博主允许不得转载。

POJ 3259 Wormholes (spfa判断负权环)

题意:给你一张图,图上有n个点,m条边,w个虫洞。 给你m条边的权值,再给你w个虫洞能回到过去的时间(也就是说是负权的意思)。 问你能不能找到一个环,环上的权值总和是负的。思路:spfa,即bel...
  • wing_wuchen
  • wing_wuchen
  • 2016年08月30日 20:35
  • 497

UVA11090 Going in Cycle!! (二分+SPFA判断有无负权)

I I U P C 2 0 0 6 Problem G: Going in Cycle!! Input: standard input Output:...
  • u010228612
  • u010228612
  • 2014年06月27日 00:02
  • 919

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

spfa 是利用队列优化的快速bellman-ford的算法,可以判断是否有负权环,如果没有的话可以求出来最短路。...
  • cFarmerReally
  • cFarmerReally
  • 2016年10月21日 15:37
  • 442

poj3259 - Wormholes

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

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 那么对于第一个公式我们可以分...
  • Grit_ICPC
  • Grit_ICPC
  • 2016年01月27日 16:36
  • 270

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

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

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

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

最短路之 SPFA(判环+负权)

下面有两种写法不同的时间复杂度可以根据自己的理解程度去选择 第一种: void Add(int u,double cost,int v)//邻接表存储关系 { w[top] = cost;...
  • u011026037
  • u011026037
  • 2014年04月02日 14:16
  • 430

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

#include #include #include #include #include #define INF 0x3f3f3f3f using namespace std; struct...
  • Anna__1997
  • Anna__1997
  • 2017年04月23日 22:00
  • 121

POJ 3259 Wormholes(spfa算法判断负权环)

spfa是Bellman-Ford的优化,原理相同。// // main.cpp // Richard // // Created by 邵金杰 on 16/8/13. // Copyrigh...
  • qq_33901573
  • qq_33901573
  • 2016年08月13日 21:59
  • 73
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3259 Wormholes (spfa判断负权环)
举报原因:
原因补充:

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