codevs1234 魔術球問題

2021-07-27 14:13:53 字數 873 閱讀 6420

好題!一開始沒想到,看了題解之後發現其實這樣的增廣方法以前是見過的,每次增加乙個結點,然後跑最大流看是否能繼續增廣,直到不能增廣為止,我記得poj2391也是這樣的增廣方法,不過那個是二分答案每次重新建圖求最大流.

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=10010,inf=0x3f3f3f3f;

int m,n,te,sz,s,t;

int vis[n],matching[n],p[n],can[n],cur[n],head[n],d[n],num[n];

struct edgee[100010];

queue

q;void add(int u,int v,int cap)

void insert(int u,int v,int cap)

int augment()

x=t;

while(x!=s)

return a;

}void bfs()

q.pop();

}}int isap()

int ok=0;

for (int i=cur[x];i;i=e[i].next)

}if (!ok)

}return flow;

}int main()

n-=2;k-=2;

for (int i=3;i<=n;i+=2)

}cout

cout

<}

}}

魔術球問題

列舉放的球,先假設新建柱子,拆成兩個點,第乙個點連s,表示後面還可以放 第二個連t表示放到其他柱子上 再列舉放過的數和它是否組成完全平方數,列舉的數的第乙個點向它的第二個點連邊,表示這個球可以放到其他球上,容量都為一 每次跑最大流出來的表示會消掉的柱子個數,如果此時球 消去的比n大則break輸出答...

魔術球問題

題目描述 題解 個人認為網路流二十三題中比較有意思的一道。先列舉球數。每加乙個球,從 s 向 xi 連一條容量為 1 的邊,從 yi 向 t 連一條容量為 1 的邊。然後從 xi 向滿足 i j 為完全平方數的 yj 連容量為 1 的邊。在殘餘網路上跑 ek 或 dinic 如果得到的最大流為 0 ...

魔術球問題

曾經在模擬賽的時候做過弱化版,不需要輸出方案。其實加強版因為資料範圍很小,模擬做也未嘗不可,暴力算出n 55時最終答案也只有1567,拿二維陣列存一下方案即可。當然,這個題是由網路流做法的,雖然我的網路流做法只是模擬了乙個貪心的過程。貪心的正確性證明就請移步我的弱化版題解好啦 對於乙個球,有兩種放法...