網路流二十四題之三 魔術球問題

2021-08-18 06:15:17 字數 1411 閱讀 9536

先來說下怎麼建模。其實就是經典的拆點模型

1.將乙個數拆成兩個點集x0,x1。

2.將x0連線至源點,x1連線至匯點

3.如果對於乙個數i要是想直接求解有點麻煩,所以可以列舉答案。每次新新增進來乙個數,然後直接在殘量網路上跑最大流就行,一旦匹配數達到n-1,也就是剛好完成了n個柱子,此時跳出就行

#include

#include

#include

using

namespace

std;

#include

#include

#include

#include

using

namespace

std;

const

int inf=0x3f3f3f3f;

const

int maxn=20000;//點數的最大值

const

int maxm=20500;//邊數的最大值

struct node

edge[maxm];

int tol;

int dep[maxn];//dep為點的層次

int head[maxn];

int t = 10000;

int m = 5000;

int n,s,ans;

void init()

void addedge(int u,int v,int w)//第一條變下標必須為偶數

bool bfs()}}

if(dep[t] == -1) return

false;

return

true;

}int dfs(int u,int f)

if(!used)dep[u]=-1;

return used;

}void dinic()

}void print_all_edge()

}inline

bool getint(int &num)

else num=in-'0';

while(in=getchar(),in>='0'&&in<='9')

if(isn) num=-num;

if(in == '\n') return

false;

return

true;

}bool check(int x)

int main()

}addedge(0,s,1);

addedge(s+m,t,1);

dinic();

printf("%d\n",ans);

if(ans > n) break;

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

return

0;}

網路流二十四題之四 魔術球問題(BALL)

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

網路流二十四題

開始了我的網路流 24 題之旅,寫在一起到時候方便一起複習哦。其實這並不是真的二十四題,有一些過於水的我就不寫上來了。然後有的 太水了就不寫了。感覺這些題目還是比較基礎的,方法卻值得借鑑!剩餘題目 航空路線問題 火星探險問題以下 題目描述 點此看題 解法 你發現時間是最大的障礙,因為對於不同的時間飛...

網路流二十四題之分配問題

沒想到codevs上的資料和我本地的資料是一樣的 這下不用寫多餘的 了 這道題和上一道題一樣水,按照提議寫成二分圖就行。1.源點向每個人連一條邊,容量1,費用0,每個任務向匯點連一條邊,容量1,費用0 2.每個人向每個任務連一條邊,容量1,費用為cij 跑兩次費用流就行 include includ...