LOJ 網路流24題 魔術球

2021-09-28 12:18:21 字數 1951 閱讀 7633

考慮如果i+j

i+ji+

j為完全平方數,則i

ii和j

jj之間連一條邊,那麼最後構成乙個圖g

gg,那麼問題即可轉化為尋找乙個最大的數字m

mm,使得按照上述方法構成的圖的最小路徑覆蓋數小於等於n

nn,我們二分m

mm即可,構造方案同最小路徑覆蓋一題。

#include

using

namespace std;

const

int n =

100000

;const

int inf =

0x3f3f3f3f

;int s,t,head[n]

,nxt[n]

,w[n]

,num=

1,to[n]

;void

add(

int u,

int v,

int ww)

int dep[n]

;bool vis[n]

;queue<

int> q;

bool

bfs()}

return vis[t];}

intdfs

(int u,

int d)

if(ret==

0) dep[u]=-

1;return ret;

}bool

check

(int num)

int par[n]

;void

init

(int n)

intfind

(int x)

void

unite

(int x,

int y)

intcal

(int all)}}

for(

int i=all+

1;i<=

2*all;i++

)int res=0;

while

(bfs()

) res+

=dfs

(s,inf)

;return all-res;

}int

main()

ans=l;

printf

("%d\n"

,ans)

; s=

0;t=

2*ans+1;

num=1;

memset

(head,0,

sizeof

(head));

for(

int i=

1;i<=ans;i++

)add

(s,i,1)

;for

(int i=

1;i<=ans;i++)}

}for

(int i=ans+

1;i<=

2*ans;i++

)int cc=0;

while

(bfs()

) cc+

=dfs

(s,inf)

;init(3

*ans)

;for

(int i=

1;i<=ans;i++)}

} vector<

int> ls;

for(

int i=ans;i;i--)}

if(ls.

empty()

)continue

;printf

("%d"

,ls[0]

);for(

int i=

1;i<

(int

)ls.

size()

;i++

)puts(""

);}return0;

}

網路流 24 題 魔術球

假設有 n n n 根柱子,現要按下述規則在這 n n n 根柱子中依次放入編號為 1,2,3,4,1,2,3,4,cdots 1,2,3,4,的球。每次只能在某根柱子的最上面放球。在同一根柱子中,任何 2 2 2 個相鄰球的編號之和為完全平方數。試設計乙個演算法,計算出在 n n n 根柱子上最多...

網路流 24 題 4 魔術球

題意 有n根柱子可以放球,球上的權值從1向後標。要求這n根柱子滿足 任意一根柱子上相鄰兩個球的和是乙個完全平方數 小的球在下面,大的球在上面 輸出最多放多少個球,和其中的一種方案。分析 第一想法是打表,是不是沒救了 然後首先就是考慮到了二分.然而範圍十分神奇.可以說是猜出來的。然後就是考慮把一些球連...

網路流24題 魔術球問題

列舉答案轉化為判定性問題,然後最小路徑覆蓋,可以轉化成二分圖最大匹配,從而用最大流解決。列舉答案a,在圖中建立節點1.a。如果對於i具體方法可以順序列舉a的值,當最小路徑覆蓋數剛好大於n時終止,a 1就是最優解。由於是順序放球,每根柱子上的球滿足這樣的特徵,即下面的球編號小於上面球的編號。抽象成圖論...