题意
比较明显是一个求负环的板子题
同时这道题floyd也可以勉强过(网上的解法)
题目链接
POJ-3259
floyd
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int n, m, W;
const int maxn = 505 , inf = 0x3f3f3f3f ;
int g[ maxn] [ maxn] ;
void init ( ) {
for ( int i = 1 ; i <= n; ++ i)
for ( int j = 1 ; j <= n; ++ j)
g[ i] [ j] = g[ j] [ i] = inf;
for ( int i = 1 ; i <= n; ++ i)
g[ i] [ i] = 0 ;
}
bool floyd ( ) {
int t;
for ( int k = 1 ; k <= n; ++ k)
for ( int i = 1 ; i <= n; ++ i) {
for ( int j = 1 ; j <= n; ++ j)
if ( ( t = g[ i] [ k] + g[ k] [ j] ) < g[ i] [ j] )
g[ i] [ j] = t;
if ( g[ i] [ i] < 0 ) return true ;
}
return false ;
}
int main ( ) {
int f;
scanf ( "%d" , & f) ;
while ( f-- ) {
scanf ( "%d%d%d" , & n, & m, & W) ;
init ( ) ;
int u, v, w;
for ( int i = 0 ; i < m; ++ i) {
scanf ( "%d%d%d" , & u, & v, & w) ;
g[ u] [ v] = g[ v] [ u] = min ( g[ u] [ v] , w) ;
}
for ( int i = 0 ; i < W; ++ i) {
scanf ( "%d%d%d" , & u, & v, & w) ;
g[ u] [ v] = - w;
}
printf ( "%s\n" , floyd ( ) ? "YES" : "NO" ) ;
}
return 0 ;
}
SPFA
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
int n;
const int MAXN = 505 , INF = 0x3f3f3f3f ;
struct Edge {
int v;
int cost;
Edge ( int _v = 0 , int _cost = 0 ) : v ( _v) , cost ( _cost) { }
} ;
vector< Edge> E[ MAXN] ;
void addedge ( int u, int v, int w) {
E[ u] . push_back ( Edge ( v, w) ) ;
}
bool vis[ MAXN] ;
int cnt[ MAXN] ;
int dist[ MAXN] ;
bool SPFA ( int start) {
memset ( vis, false , sizeof vis) ;
memset ( cnt, 0 , sizeof cnt) ;
memset ( dist, INF, sizeof dist) ;
queue< int > que;
que. push ( start) ;
++ cnt[ start] ;
dist[ start] = 0 ;
while ( ! que. empty ( ) ) {
int u = que. front ( ) ; que. pop ( ) ;
vis[ u] = false ;
for ( int i = 0 ; i < E[ u] . size ( ) ; ++ i) {
int v = E[ u] [ i] . v;
if ( dist[ v] > dist[ u] + E[ u] [ i] . cost) {
dist[ v] = dist[ u] + E[ u] [ i] . cost;
if ( ! vis[ v] ) {
vis[ v] = true ;
que. push ( v) ;
if ( ++ cnt[ v] > n) return true ;
}
}
}
}
return false ;
}
int main ( ) {
int f, m, W;
scanf ( "%d" , & f) ;
while ( f-- ) {
scanf ( "%d%d%d" , & n, & m, & W) ;
int u, v, w;
for ( int i = 0 ; i < m; ++ i) {
scanf ( "%d%d%d" , & u, & v, & w) ;
addedge ( u, v, w) ;
addedge ( v, u, w) ;
}
for ( int i = 0 ; i < W; ++ i) {
scanf ( "%d%d%d" , & u, & v, & w) ;
addedge ( u, v, - w) ;
}
printf ( "%s\n" , SPFA ( 1 ) ? "YES" : "NO" ) ;
for ( int i = 1 ; i <= n; ++ i)
E[ i] . clear ( ) ;
}
return 0 ;
}