題意比較坑,移動完以後的士兵不能再次移動,不然樣例都過不了。。。
最小值最大滿足決策單調性所以二分答案,跑網路流驗證是否可行。
這種題重點在建圖,為了保證只移動一次,拆點,乙個入點乙個出點,到了出點的自然不能再次排程。
不在邊界上的邊連一條容量為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不必由它本身提供
,移動完以後的士兵不能再次移動,那麼能往邊界上的流量可能會減少,除非移動完以後的士兵能再次移動這樣才是對的。題意坑啊。。。
#includeusingnamespace
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...