poj1459多源點多匯點最大流

2021-06-03 02:20:57 字數 1975 閱讀 7164

題意:有許多發電廠,需求電的地方(就說耗電場吧)和一些中轉站,要求出各個耗電場耗電之和,並使之最大。其中邊上的權值為能流通的最大電量。

題目解析:這道題目也是很簡單的最大流題目,只需要新增乙個總的源點和乙個總的匯點,然後從總源點到子源點邊上的權值為子源點的發電量,從匯點到總匯點邊上的權值為子匯點的需求電量。就轉化成了單源點單匯點的最大流問題了。剛學網路流,不成熟的sap演算法,**如下:

#include#include#includeusing namespace std;

#define maxn 205

#define ins 0xfffffff

#define clr(arr) memset(arr,0,sizeof(arr))

int map[maxn][maxn];

int cate[maxn],index[maxn],gap[maxn];

int pre[maxn],q[maxn];

bool vis[maxn],flag;

int minres;

void init_gap_bfs(int n)

} start = (start+1)%size; }}

bool dfs(int k,int n)

index[ gap[k] ]--; index[ gap[k]+1 ]++;

if(index[ gap[k] ] == 0) flag = true;

gap[k] += 1;

return false;

}int sap(int b,int n)

} return maxflow;

}int main()

for(int i = 0;i < np + nc;++i)

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

init_gap_bfs(n+1);

printf("%d\n",sap(0,n+1));

} return 0;

}

下面是用間隙優化和弧優化的**,不過弧優化沒寫好,每次當從k點找不到增廣路的時候,更新從k點到匯點的距離,是自加1,不是找所有孩子裡匯點最近的加1,不知道怎麼處理的,提交結果竟然時間一點也沒減少。。。。可能是沒用鄰接表存邊的關係吧,參考**:

#include#include#includeusing namespace std;

#define maxn 205

#define ins 0xfffffff

#define clr(arr) memset(arr,0,sizeof(arr))

int map[maxn][maxn];

int cate[maxn],index[maxn],gap[maxn];

int pre[maxn],q[maxn],stck[maxn];

bool vis[maxn],flag;

int minres,top;

void init_gap_bfs(int n)

} start = (start+1)%size; }}

bool dfs(int k,int n)

} index[ gap[k] ]--;

index[ gap[k]+1 ]++;

if(index[ gap[k] ] == 0) flag = true;

gap[k] += 1; top--;

return false;

}int sap(int b,int n)

top = 0;

} return maxflow;

}int main()

for(int i = 0;i < np + nc;++i)

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

init_gap_bfs(n+1);

printf("%d\n",sap(0,n+1));

} return 0;

}

POJ1459 多源點多匯點的網路流

多源點多匯點的網路流其實處理方法很簡單.給所有源點加乙個超級源點.給所有匯點加乙個超級匯點.然後赤果果的最大流.poj1459 多源點多匯點最大流.dinic模板題.includeusing namespace std const int oo 2000000000 int n,np,nc,m,ne...

poj1459 多源點網路流

題意 有n個點,np個供電點,nc個消費點,m條線路,接來題目先給出的是m條帶權路徑,然後是np個供電點和權值,接著就是nc個消費點和權值。題目要我們求出給定的圖最大能消費的總電量 就是求最大流 思路 建乙個超級源點,乙個超級匯點。超級源點連線所以供電站,所以消費點連線超級匯點。跑一遍網路流即可。i...

poj1459多源多匯最大流問題

基本構圖題,多源多匯,新增乙個源點和乙個匯點,所有源點都來自這個源點,同理,所有匯點 都匯於這個匯點,dinic第二戰,本來應該1a的,犯了乙個低階錯誤!while scanf d 要加 啊!sb了,記住這個教訓!此次順帶學習了scanf的又一讀入,忽略空格和已有符號,不錯,並且更加了解了 dini...