網路流24題 魔術球問題

2022-03-22 16:18:19 字數 1440 閱讀 9475

以珠子為點,滿足條件就兩兩連邊

那麼就是讓你求n條路徑最多能覆蓋多少節點。

眾所周知,最小邊覆蓋=點總數-最大匹配

不會看這裡link

於是拆點跑二分圖即可

大概就是s向x連邊

滿足條件的點k向x'連邊

x'向t連邊

有兩種方式

1.我們輪流加點,每次在殘量網路跑最大流就可以了

2.我們二分答案,每次重新跑最大流

實測前一種更快。

qwq輸出答案就看哪條邊的流量跑滿了。

/*

@date : 2019-07-20 15:12:45

@author : adscn ([email protected])

@link :

*/#includeusing namespace std;

#define il inline

#define rg register

#define gi getint()

#define gc getchar()

#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)

il int getint()

templateil void pi(t k,char ch=0)

const int n=10000;

const int t=30000;

const int s=0;

int sqr[n+7];

struct edgee[200007];

int head[50007],cnt;

int cur[50007];

inline void add(int u,int v,int flow)

; head[u]=cnt++;

}inline void link(int u,int v,int flow)

int dep[50007];

inline bool bfs(void)

} return dep[t];

}inline int dfs(int p,int restflow)

} return sumflow;

}inline int dinic()

int main(void)

--num;

pi(num,'\n');

static int to[50007];

for(int k=1;k<=num;++k)

for(int i=head[k];~i;i=e[i].nxt)

if(!e[i].flow)

static int vis[50007];

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

if(!vis[i])

return 0;

}

網路流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跟柱子看做是n條路徑,問題也就轉換成了用n條路徑覆蓋所有的點,也就是最小路徑覆蓋問題。最小路徑覆蓋數隨著點數的增加不會遞減,滿足二分的性質,但是二分時要重新構圖,所以不如直接順序列...