魔術球問題 網路流24題 4 24

2021-09-26 18:32:19 字數 1312 閱讀 7750

魔術球問題

題面:

假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,…的球。

(1)每次只能在某根柱子的最上面放球。

(2)在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。

試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。

«程式設計任務:

對於給定的n,計算在n根柱子上最多能放多少個球。

4<=n<=55

思路:我們可以轉換一下思路,若是給你球的數量,問你至少需要多少個柱子,就變成了最小路徑覆蓋問題了,將每個球拆點,且若兩個數之和為完全平方數就連邊。然後我們可以逐步加邊跑最大流,直至需要符合要求,我們需要求到(n+1)根柱子需要多少個球,再減掉1個就是n根柱子最多有多少個球

#include

#define inf 0x3f3f3f3f

using

namespace std;

const

int n =

10005

;int n, m, ss, tt;

int dis[n]

;int cur[n]

;queue<

int> q;

int mark[n]

,to[n]

;struct edge e[n *8]

;int head[n]

, cnt =-1

;void

add(

int from,

int to,

int value)

bool

bfs(

int s,

int t)}}

return dis[t]!=-

1;}int

dfs(

int x,

int t,

int maxflow)

return ans;

}int

dinic

(int s,

int t)

return ans;

}int

main()

printf

("%d\n"

,s-1);

for(

int i=

1;i) k=e[k]

.next;}}

for(

int i=

1;i)printf

("\n");

}return0;

}

網路流24題 魔術球問題

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

魔術球問題(網路流24題)

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

網路流24題 魔術球問題

以珠子為點,滿足條件就兩兩連邊 那麼就是讓你求n條路徑最多能覆蓋多少節點。眾所周知,最小邊覆蓋 點總數 最大匹配 不會看這裡link 於是拆點跑二分圖即可 大概就是s向x連邊 滿足條件的點k向x 連邊 x 向t連邊 有兩種方式 1.我們輪流加點,每次在殘量網路跑最大流就可以了 2.我們二分答案,每次...