網路流24題 魔術球問題

2022-05-01 03:48:09 字數 1153 閱讀 1768

題目描述

將所有球看做點,在每根柱子上放球就是下邊的點向上邊的點連邊,可以連邊的條件是兩球編號之和為完全平方數。

再把這n跟柱子看做是n條路徑,問題也就轉換成了用n條路徑覆蓋所有的點,也就是最小路徑覆蓋問題。

//最小路徑覆蓋數隨著點數的增加不會遞減,滿足二分的性質,但是二分時要重新構圖,所以不如直接順序列舉答案,這樣可以利用上次的殘量網路,降低了複雜度。

對於新列舉到的球,有兩種選擇:

1.放到已經有球的柱子上

2.自己單獨開闢一根柱子(柱子數不超過n)

所以將這個新的球與已經放好的球連邊(需滿足條件),重新跑一遍最大流,這時若沒有新流,則說明這個新球不能放在任何乙個已經有球的柱子上。

//num陣列記錄每根柱子最下邊的球的編號,用於輸出方案。

#include#include

using

namespace

std;

const

int inf=0x3f3f3f3f

;const

int n=3507

;struct

nodee[n*n];

int n,enum=1

,s,t,tot;

intfront[n],cur[n],deep[n],num[n],path[n];

intq[n];

bool

vis[n];

void insert(int u,int

v)bool

bfs()

int head=1,tail=0

,u,v;

deep[s]=1;q[++tail]=s;

while(head<=tail)}}

return0;

}int dfs(int x,int

cur_flow)

}deep[x]=0

;

return cur_flow-rest;

}int

dinic()

intmain()

printf(

"%d\n

",tot-1

);

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

puts(

"");

}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.我們二分答案,每次...