POJ 3259 SPFA
生活随笔
收集整理的這篇文章主要介紹了
POJ 3259 SPFA
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這題讓我英語太受打擊了,題意難懂,讀懂題意紙老虎。
算法:
1.題意本質就是判斷是否存在負權回路。
2.SPFA,一個點入隊大于等于N次,就說明它存在負權回路。
View Code #include <stdio.h> #include <string.h> #include <stdlib.h> #include <queue> #include <iostream> using namespace std; #define MAXN 100100struct Edge {int u, next, val;Edge() {}Edge( int v , int Next ,int Val): u(v),next(Next), val(Val) { } }edge[MAXN];const int inf = 0x7f7f7f7f; int head[MAXN],dis[MAXN], visit[MAXN], size, hash[MAXN];int N, M, W, T;struct node {int ID,dis; };void init( ) {for( int i = 0; i <= N; i++){head[i] = -1;visit[i] = 0;dis[i] = inf;hash[i] = 0;}size = 0;}void AddEdge( int u, int v, int val, int num) {edge[size] = Edge( v, head[u], val);head[u] = size++;if( !num ){edge[size] = Edge( u, head[v], val);head[v] = size++;}}void SPFA( ) {queue<node>q;node p;p.ID = 1;p.dis = 0;q.push(p);dis[1] = 0;while( !q.empty( )){ p = q.front( );q.pop();int v = p.ID;int wx = dis[v];visit[v] = 0;for( int e = head[v]; e != -1; e = edge[e].next){ int u = edge[e].u;int w = edge[e].val;if( dis[u] > wx + w ){dis[u] = wx + w;if( !visit[u] ){ p.ID = u;p.dis = dis[u];visit[u] = 1;q.push( p );hash[u]++;}if( hash[u] >= N ){puts("YES");return ; }} }}puts("NO"); } int main( ) {int a, b, c;scanf("%d", &T);while(T--){scanf("%d%d%d", &N, &M, &W);init( ); for( int i = 1; i <= M; i++){scanf("%d%d%d", &a, &b, &c);AddEdge( a, b, c, 0); }for( int i = 1; i <= W; i++){ scanf("%d%d%d", &a, &b, &c);AddEdge( a, b, -c, 1); }SPFA( );} return 0; }轉載于:https://www.cnblogs.com/tangcong/archive/2012/07/10/2585122.html
總結
以上是生活随笔為你收集整理的POJ 3259 SPFA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android第五天晚:surfaceV
- 下一篇: HDU 1565 状态压缩