HDU 1531 King 差分約束

2021-06-23 05:12:52 字數 1465 閱讀 9745

傳送門:【hdu】1531 king

題目分析:差分約束!題目意思看了半天。。。。題目不難,但是陷阱很好。。。。

首先對於每個式子si ni gt ki,令v=si+ni,u=si-1,則有xv-xu>ki --> xv-xu>=ki+1 -->xu-xv<=-ki-1,可以建邊(v,u,-ki-1),對於每個式子si ni lt ki,令v=si+ni,u=si-1,則有xv-xuxv-xu<=ki-1,可以建邊(u,v,ki-1),然後設立乙個源點xs,對所有的xi建邊(xs,xi,0),跑一遍帶負環判斷的spfa,如果乙個xi被更新了至少n+1次,那麼說明題目中存在負環。否則沒有負環。

坑爹的就是這至少n+1次。。我設成n次就錯了。。。其實也對,加上s一共n+1個點。。。

**如下:

#include #include #include using namespace std ;

#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )

#define for( i , a , b ) for ( int i = a ; i <= b ; ++ i )

#define rev( i , a , b ) for ( int i = a ; i >= b ; -- i )

#define clr( a , x ) memset ( a , x , sizeof a )

const int maxn = 105 ;

const int maxq = 105 ;

const int maxe = 1000 ;

const int inf = 0x3f3f3f3f ;

struct edge

edge ( int v , int c , edge *next ) : v ( v ) , c ( c ) , next ( next ) {}

} e[maxe] , *h[maxn] , *cnte ;

int d[maxn] ;

int in[maxn] ;

bool inq[maxn] ;

int q[maxn] , head , tail ;

int n , m ;

int s ;

void init ()

void addedge ( int u , int v , int c )

bool spfa () else }}

} }return true ;

}void solve ()

s = n + 1 ;

for ( i , 1 , n ) addedge ( s , i , 0 ) ;

bool flag = spfa () ;

printf ( "%s\n" , flag ? "lamentable kingdom" : "successful conspiracy" ) ;}

int main ()

hdu 1531 差分約束

差分約束的題之前也碰到過,剛好最近正在進行圖論專題的訓練,就拿來做一做。對於差分不等式,a b c 建一條 b 到 a 的權值為 c 的邊,求的是最短路,得到的是最大值 對於不等式 a b c 建一條 b 到 a 的權值為 c 的邊,求的是最長路,得到的是最小值 存在負環的話是無解 求不出最短路 d...

poj 1364 King 差分約束

注意差分約束只能求 或 spfa判斷有無負權迴路。對於差分不等式,a b c 建一條 b 到 a 的權值為 c 的邊,求的是最短路,得到的是最大值 對於不等式 a b c 建一條 b 到 a 的權值為 c 的邊,求的是最長路,得到的是最小值。存在負環的話是無解,求不出最短路 dist 沒有得到更新 ...

Uva 515 King 差分約束

題目分析 這道題是一道裸地差分約束題,直接套模板。下面是 include include includeusing namespace std const int maxn 210 const int inf 100000000 int v maxn w maxn first maxn next m...