UVA 11478 Halum 差分約束

2021-06-20 08:52:57 字數 2037 閱讀 3831

題目大意:

給定乙個有向圖,每條邊都有乙個權值,每次你可以選擇乙個結點v和整數d,把所有以v為終點的邊權值減少d,把所有以v為起點的邊權值增加d,最後要讓所有的邊權值非負且最大。

思路:為了做這題前面先做了好幾題差分約束的。。。。

作者思路很巧妙:

不同的操作互不影響,因此可以按任意的順序實施這些操作,另外,對於同乙個結點的多次操作也可以合併,因此令sum(u)為作用於結點u上的所有d之和。這樣,本題的目標就是確定所有的sum(u),使得操作之後所有邊權值的最小值盡量大。

「最小值最大」使用二分答案的方法。二分答案x之後,問題轉化為是否可以讓操作完畢後每條邊的權值均不小於x。對於邊a->b,不難發現操作完畢後它的權值為w(a,b)+sum(a)-sum(b),因此每條邊a->b都可以列出乙個不等式w(a,b)+sum(a)-sum(b)>=x,移項得sum(b)-sum(a)<=w(a,b)-x。這樣,我們實際得到乙個差分約束系統。

查分約束系統是指乙個不等式組,每個不等式形如xj-xi<=bk,這裡的bk是一些事先已知的常數。這個不等式類似於最短路中的不等式d[v]<=d[u]+w(u,v),我們可以用最短路演算法求解:對於約束條件xj-xi《=bk,新建一條邊i-->j,權值為bk。如果圖中有負權環,則差分約束系統無解。

ps:用超級源點的話2.7s,如果不用超級源點,把所有點加入佇列那麼2.1s。。。以後我還是不用超級源點吧。

#include#include#includeusing namespace std;

const int maxn=500+10;

const int maxm=2700+10;

const int inf=100000+10;

int head[maxn],len,dis[maxn],vis[maxn],cnt[maxn],n,m;

struct edge

e[maxm];

void add(int from,int to,int val)

bool spfa()

while(!q.empty())

}} }

return true;

}bool change(int x)

int main()

if(change(r))

else if(!change(l))

int ans=l++;

while(l>1);

if(!change(mid))

r=mid;

else

}printf("%d\n",ans);

} return 0;

}

超級源點。。。以後差分約束不用了- -

#include#include#includeusing namespace std;

const int maxn=500+10;

const int maxm=27000;

const int inf=100000+10;

int head[maxn],len,dis[maxn],vis[maxn],cnt[maxn],n,m;

struct edge

e[maxm];

void add(int from,int to,int val)

bool spfa()

queueq;

q.push(0);

cnt[0]++;

dis[0]=0;

vis[0]=true;

while(!q.empty())

}} }

return true;

}bool change(int x)

int main()

if(change(r))

else if(!change(l))

int ans=l++;

while(l>1);

if(!change(mid))

r=mid;

else

}printf("%d\n",ans);

} return 0;

}

UVA11478 Halum 差分約束系統

給定乙個有向圖,每條邊都有乙個權值。每次你可以選擇乙個結點v和乙個整數d,把所有以v為終點的邊的權值減小d,把所有以v為起點的邊的權值增加d,最後讓所有邊的權值的最小值大於零且盡量大。該死書上翻譯錯了 0不是非負 wa好幾次因為這個 考慮每條邊的約束,di表示i的halum量 w dv du 0 d...

UVA 11478 差分約束 二分)

題意 給定乙個有向圖,每條邊都有乙個權值,每次你可以選擇乙個結點和乙個整數的,把所有以v為終點的邊的權值減去d,把所有以v為起點的邊的權值加上d 最後要讓所有邊的權的最小值非負且盡量大 include include include include include includeusing name...

uva515 差分約束

題目的意思就是就是求問是否存在滿足條件的序列 就是指 從 開始加,往後在加兩個 就是指 這是一道 差分約束 模板題,這裡就不具體說差分約束了 給大家乙個部落格 include includeconst int inf 0x3f3f3f3f const int n 220 int u n int v ...