poj3259(最短路+负权处理)

题意:

N,个点,M条路,W个虫洞,虫洞的边就是负的

如果出现负环代表YES

#include <iostream>
#include <string.h>
#include <queue>
#include <vector>
#include <utility>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define maxn 1000

const int  INF = 1111111111;
int N,M,W;
int mp[maxn][maxn];
int dis[maxn];
int num[maxn];
int vis[maxn];

void init()
{
    for(int i = 1; i <= N; i++) fill(mp[i],mp[i]+N+1,INF);
    fill(dis,dis+N+1,INF);
    fill(num,num+N+1,0);
}

int SPFA(int s)
{
    queue<int> que;
    dis[s] = 0;
    que.push(s);
    while(!que.empty())
    {
        int u = que.front();
        que.pop();
        if(++num[u] >= N) return 1;
        for(int i = 1; i <= N; i++)
        {
            if(dis[i] > dis[u] + mp[u][i])
            {
                dis[i] = dis[u] + mp[u][i];
                que.push(i);
            }
        }
    }

    return 0;
}
int  main()
{
#ifdef xxz
    freopen("in.txt","r",stdin);
#endif // xxz

    int T,S,E,Case;
    scanf("%d",&Case);
    while(Case--)
    {

        scanf("%d%d%d",&N,&M,&W);
        init();//好坑啊,把这个函数写到上面了,WA了十多发才发现....晕
        for(int i = 0; i < M; i++)
        {
            scanf("%d%d%d",&S,&E,&T);
            if(T < mp[S][E]) mp[S][E] = mp[E][S] = T;
        }

        for(int i = 0; i < W; i++)
        {
            scanf("%d%d%d",&S,&E,&T);
            mp[S][E] = -T;
        }

       if(SPFA(1)) printf("YES\n");
       else printf("NO\n");

    }
    return 0;
}
时间: 2024-10-27 06:23:35

poj3259(最短路+负权处理)的相关文章

UVa 515 - King (差分约束系统 + SPFA求带负权最短路)

下面是差分约束系统的详细介绍,以及解决方法~ 摘抄自 xuezhongfenfei(他好像也是转的....) 差分约束系统 X1 - X2 <= 0 X1 - X5 <= -1 X2 - X5 <= 1 X3 - X1 <= 5 X4 - X1 <= 4 X4 - X3 <= -1 X5 - X3 <= -3 X5 - X4 <= -3 不等式组(1) 全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘以-1就可以化成小于等于).这样的不等式组

POJ 3259 Wormholes 虫洞(负权最短路,负环)

题意:给一个混合图,求判断是否有负环的存在,若有,输出YES,否则NO.有重边. 思路:这是spfa的功能范围.一个点入队列超过n次就是有负环了.因为是混合图,所以当你跑一次spfa时发现没有负环,但是负环仍可能存在,因为有向边! 但是单源最短路也有起点啊,难道穷举起点?不用,负环是必须有某些边是带负权的,那么我们只要穷举负权边的起点就行了,因为单单跑一次spfa不能保证能遍历所有点,但是如果穷举负权边起点还没有找到负环,那么负环不可能存在(剩下的都是正权,怎么可能有负环). 1 //#incl

Bellman-Ford 求含负权最短路

该算法详解请看   https://www.cnblogs.com/tanky_woo/archive/2011/01/17/1937728.html 单源最短路   当图中存在负权边时 迪杰斯特拉就不能用了 该算法解决了此问题 时间复杂度O(nm) 注意   图中含有负圈时不成立.当判定存在负圈时,这只说明s可以到达一个负圈,并不代表s到每个点的最短路都不存在. 另外,如果图中有其他负圈但是s无法达到这个负圈,该算法也无法找到,解决方法加一个节点(还不会...) 该算法可以用 队列 优化 名为

spfa 算法模板 可求带负权边的最短路

它是队列优化的Bellman-Ford算法. 优化的原理是:下一次松弛操作时被更新dis的点其实与上一次被更新的点有关!如果上一次被更新的点有一条边指向某点V,那么在下一次,点V就是可能被更新dis的点. 和 Bellman-Ford 算法一样,它可以用来求带负权边的最短路,如果存在一个从源点可以到达的权重为负值的环路,则返回false表示无解决方案,因为可以不断在这个环路中循环使总代价越来越小:如果不存在则返回true. #include<iostream> #include<algo

poj 3259 Wormholes (负权最短路,SPAF)

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 36641   Accepted: 13405 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 p

poj 3259 bellman最短路判断有无负权回路

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 36717   Accepted: 13438 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 p

poj3259 bellman——ford Wormholes解绝负权问题

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 35103   Accepted: 12805 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 p

poj 3259 Wormholes 【最短路之负权环的判断】

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 54435   Accepted: 20273 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 p

bellman-ford(可判负权回路+记录路径)

#include<iostream> #include<cstdio> using namespace std; #define MAX 0x3f3f3f3f #define N 1010 int nodenum, edgenum, original; //点,边,起点 typedef struct Edge //边 { int u, v; int cost; }Edge; Edge edge[N]; int dis[N], pre[N]; bool Bellman_Ford()