UVA 12264 Risk (二分,網路流)

2022-04-04 08:51:48 字數 1753 閱讀 8417

題意比較坑,移動完以後的士兵不能再次移動,不然樣例都過不了。。。

最小值最大滿足決策單調性所以二分答案,跑網路流驗證是否可行。

這種題重點在建圖,為了保證只移動一次,拆點,乙個入點乙個出點,到了出點的自然不能再次排程。

不在邊界上的邊連一條容量為1的邊表示至少留乙個人,在邊界上的與t的連邊就設定成mid。

其他細節:

注意二分答案的時候如果是l=mid+1,r=mid這樣的(l+r)/2向下取整,

l=mid,r=mid-1則(l+r)/2向上取整,否則遇到如r = l+1判斷後執行l = mid這種情況就會死迴圈。

一開始我想直接把不再邊界上的流量減一,但是這樣做相當與強行把當前位置往t流了1,實際上它的1不必由它本身提供

,移動完以後的士兵不能再次移動,那麼能往邊界上的流量可能會減少,除非移動完以後的士兵能再次移動這樣才是對的。題意坑啊。。。

#includeusing

namespace

std;

const

int maxn = 105

<<1

;int

a[maxn],n;

struct

edge

;vector

edges;

#define pb push_back

inthead[maxn];

void addedge(int u,int v,int

c));

head[u] = edges.size()-1

; edges.pb();

head[v] = edges.size()-1;}

const

int inf = 0x3f3f3f3f

;int

s,t,cur[maxn],q[maxn],d[maxn];

bool

bfs()}}

return

d[t];

}int dfs(int u,int

a) }

return

flow;

}int

maxflow()

return

flow;

}vector

change;

void

init()

void rebuild(int

cap)

for(int i = 0; i < change.size(); i++)

}int

main()

char

str[maxn];

int cnt = 0,sum = 0

;

for(int i = 0; i < n; i++)

}addedge(s,i,a[i]);

addedge(i,i+n,inf);

if(border) change.pb(edges.size()),addedge(i+n,t,0),cnt++;

else addedge(i+n,t,1),sum++;

}intmid;

for(; l < r; sum + mid*cnt == maxflow()? l = mid:r = mid-1

) mid = (l+r+1)>>1,rebuild(mid);//

l = mid.上取整 l = mid+1 下取整

printf("

%d\n

",l);

}return0;

}

uva 12264 (Risk) 二分 最大流

題意 首先有n個點,然後每個點都乙個權值ai表示這個點上的士兵數量,如果ai為0則表示這個點是敵人的,如果大於零則表示這個點是自己的並且有ai個士兵,現在你只有一次機會可以移動所有的士兵,注意 每個士兵只能移動一次,並且只有兩種選擇,要麼不動,要麼移動到相鄰的乙個單位處的的自己的點上,並且自己的點在...

(二分 網路流)Optimal Milking

題意為n個奶牛站,m頭奶牛,每個奶牛站的奶牛上限k 給出奶牛站和奶牛對其他實體的距離,距離為0即為兩個實體無路徑,求出所有奶牛到奶牛站中走的最遠的奶牛的最遠距離的最小值 最大中的最小問題,可以二分。我們先用floyd處理出實體到實體之間的最近距離,二分這個最遠距離,建圖 兩實體距離小於等於二分值時才...

BZOJ 1305 二分 網路流

思路 建圖我根本沒有想到啊 我是不會告訴你我借鑑了一下題解的思路 把每個人拆成喜歡的和不喜歡的點 男 喜歡 向 男 不喜歡 連 邊權為k的邊 如果男喜歡女 那麼 男喜歡向 女喜歡 連 1 如果男 不喜歡女 那麼 男不喜歡 向 女不喜歡 連1 男 喜歡 向 男不喜歡 連k 女 不喜歡 向 女喜歡 連k...