傳送門:【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...