先來說下怎麼建模。其實就是經典的拆點模型
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...