洛谷P2765魔術球問題 最小路徑覆蓋

2022-05-20 02:38:49 字數 2423 閱讀 6232

看到這一題第一眼想到:這不是二分最大流嗎,後來發現還有一種更快的方法。

首先如果知道要放多少個球求最少的柱子,很顯然是一道最小點路徑覆蓋的題,將乙個點拆成u,v兩個點,u和s相連,v和t相連,之後的有向邊i,就用ui和vj相連即可。

但是這題首先不知道有多少個球,所以考慮依次加入點以及和這個點相關的邊,然後在殘餘網路上跑新的最大流,如果可以跑出流量來意味著這個點成功在現有的柱子上按排上了,如果跑不出來說明按排不上,需要重新開一根柱子放這個點。

直到跑到答案k的時候,柱子數超過了n,要的答案就是k - 1,至於方案,只要在最後的殘餘網路圖上面搜尋一下每個點的前驅即可。

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define for(i, x, y) for(int i=x;i<=y;i++)

#define _for(i, x, y) for(int i=x;i>=y;i--)

#define mem(f, x) memset(f,x,sizeof(f))

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

#define sca2(x,y) scanf("%d%d",&x,&y)

#define sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define scl(x) scanf("%lld",&x);

#define pri(x) printf("%d\n", x)

#define prl(x) printf("%lld\n",x);

#define clr(u) for(int i=0;i<=n;i++)u[i].clear();

#define ll long long

#define ull unsigned long long

#define mp make_pair

#define pii pair#define pil pair#define pll pair#define pb push_back

#define fi first

#define se second typedef vector

vi;int read()

while (c >= '

0'&&c <= '

9')return x*f;}

const

double eps = 1e-9

;const

int maxn = 3010

;const

int maxm = 80010

;const

int inf = 0x3f3f3f3f

;const

int mod = 1e9 + 7

; int

n,m,k;

inta[maxn];

struct

edge

edge(

int to,int next,int cap,int

flow):to(to),next(next),cap(cap),flow(flow){}

}edge[maxm * 2

];int head[maxn * 2],dis[maxn * 2],pre[maxn * 2],nxt[maxn * 2],vis[maxn * 2

];int

n,s,tot,t;

void init(int n,int s,int

t)void add(int u,int v,int

w)bool

bfs()

}return ~dis[t];

}int dfs(int u,int

a)

return

flow;

}int

maxflow()

return

flow;

}void search(int

t) }

}for(int i = 1; i <= t; i ++)

puts(

"");}}

}int

main()

if(!maxflow()) num++;

} k-=2; num--;

pri(k);

search(k);

return0;

}

洛谷P2765 魔術球問題

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

洛谷 P2765 魔術球問題

有n個柱子,編號為1,2 的小環,要將它們依次套在環上,要求直接接觸的兩小球的和為完全平方數,那麼最多可以套幾個小球。首先可以貪心,如果可以套在其他小球上,則套在其他小球上,反之,套在柱子上,直到沒有多餘柱子,可以證明這是對的,但我覺得還是網路流的做法比較重要。因為要依次取小球,那麼當答案為ans時...

洛谷 P2765 魔術球問題

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