題意:
n個人編號分別是1…n在排隊,排隊順序與序號相同。現在有x個喜歡關係和y個厭惡關係
對於每乙個喜歡關係 :a b c 代表編號a和編號c之間的距離需要<=c
對於每乙個厭惡關係:a b c 代表編號a和編號c之間的距離需要》=c
問在能否滿足條件,如果滿足條件求1~n之間的最大距離,如果距離無限大輸出-2
分析:
假設d[i]
d[i]
d[i]
為編號為i
ii的成員距離隊首的距離。
那麼根據題意我們有下列約束條件
因為求最大,我們我們最短路求滿足差分約束下的源點1到n的最小距離即可
#include
#define mset(a,b) memset(a,b,sizeof(a))
using
namespace std;
typedef
long
long ll;
typedef pair<
int,
int> p;
const
int inf=
0x3f3f3f3f
;struct edge
edge
(int to,
int w):to
(to),w
(w)}
;int dis[
1005
],in[
1005];
//距離
vector adja[
1005];
//鄰接表
bool book[
1005];
//標記是否夠在佇列
bool
spfa
(int s,
int n)
//源點為s,共有n個點,求最短路}}
}return
false;}
int t[
1005];
intmain()
for(
int i=
0;i++i)
for(
int i=
2;i<=n;
++i) adja[i]
.push_back
(edge(1
,0))
;for
(int i=
2;i<=n;
++i) adja[i]
.push_back
(edge
(i-1,-
1));
if(!spfa(1
,n))
else
}return0;
}
hdu3592(差分約束)
差分約束 學習鏈結 題意 給一些限制條件,求1到n的最大距離,可轉化成求最短路徑,將不等式化成 的形式 有負邊,要用spfa,不能用dijkstra演算法 如下 include include include include include include include include inclu...
HDU 3592(差分約束)
2015 01 07 00 40 57 思路 差分約束題,用si表示 i 距離第1個人的距離。根據條件 1 約束一 s b s a c 2 約束二 s b s a c 因為要求最長可能距離,所以轉化為求最短路。約束一化為 s b s a c,約束二化為 s a s b c 1 include 2 i...
差分約束 hdu 3666
xij ai l bj 0 xij ai u bj 0 兩邊取對數來去除ai,bj前面的係數 有 logbj logai logxij logu logai log bj logl logxij 化成標準差分約束,建圖,spfa,注意乙個竅門,當入隊總數大於2 n m 時就可以輸出no 因為 乙個點...