網路流專題 魔術球問題 (最大流)

2021-08-29 07:52:01 字數 2044 閱讀 2362

«問題描述:

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

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

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

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

«程式設計任務:

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

輸入格式:

第1 行有1個正整數n,表示柱子數。

輸出格式:

程式執行結束時,將n 根柱子上最多能放的球數以及相應的放置方案輸出。檔案的第一行是球數。接下來的n行,每行是一根柱子上的球的編號。

輸入樣例#1:複製

4
輸出樣例#1:複製

11

1 82 7 9

3 6 10

4 5 11

感謝 @phoenixeclipse 提供spj

4<=n<=55

解題思路:讀完題目先來了一發暴力,結果連n=8都跑不出來。。。。

正確的解題思路:我沒想到這一道題能往網路流上轉換,即使我剛寫了乙個最小路徑覆蓋的題。。。。

我的理解:主要是建圖,和同種型別題的相互轉化。。還是太菜了,沒有體會到題目的內在聯絡。

每個點都能連向乙個前驅和後繼(滿足條件),然後拆點跑最大流,這裡主要是利用了乙個定理

路徑數=點數-點的匹配數(不重複點)

由於總的點數不確定,但是給的路徑數是確定的,並且路徑數隨著點數的增加單調不減。可以二分,但是列舉可以更方便一點。

這樣我們一直加邊用dinic跑殘餘網路。

停止的條件:依據上邊的定理當路徑數(這裡代表方案數)大於題目所給的時候停止。

需要注意的事情:這裡我們並不知道點數要列舉到多少,所以我們應該在允許的時間內把陣列開大一點。

列舉的時候我們要列舉比當前小的點與當前點時候匹配。

#include#include#include#include#include#include#include#include#includeusing namespace std;

#define rep(i,j,k) for(int i=j;i<=k;i++)

#define sca(x) scanf("%d",&x)

#define pb(x) push_back(x)

#define per(i,j,k) for(int i=j;i>=k;i--)

#define inf 0x3f3f3f3f

#define ll long long

#define n 15005

#define maxn 200000

#define inf 0x3f3f3f3f

struct edg

g[maxn];

int tot,s,t,k,ans;

int head[n+10];

int isq[n+10];

void addedg(int u,int v,int w)

int dep[n+10],cur[n];

bool bfs(int s,int t)}}

return dep[t]!=-1;

}int dfs(int s,int flow)

}return 0;

}void dinic(int s,int t)

}int fa[n],ou[n];

int f(int x)

void u(int x,int y)

void print(int n,int k)

}rep(i,1,n)

}puts("");

}}int viss[n];

int main()

}dinic(s,t);

}while(now-ans<=n);

printf("%d\n",now-1);

print(now-1,k);

}

網路流24題 魔術球問題 最大流

洛谷傳送門 loj傳送門 腦抽寫了個費用流 t 飛了,看了題解才明白是怎麼跑最大流的 這道題有乙個貪心,如果小於它的數沒有能和它之和是完全平方數的,那麼它一定要新建乙個柱子 證明可以看poorpool神犇的這篇部落格 由於每個點只能用一次,所以每個點 x 拆成 2 個點 x1 和 x2 x1 和源點...

網路流 魔術球問題

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

網路流24題 魔術球問題

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