題意:有許多發電廠,需求電的地方(就說耗電場吧)和一些中轉站,要求出各個耗電場耗電之和,並使之最大。其中邊上的權值為能流通的最大電量。
題目解析:這道題目也是很簡單的最大流題目,只需要新增乙個總的源點和乙個總的匯點,然後從總源點到子源點邊上的權值為子源點的發電量,從匯點到總匯點邊上的權值為子匯點的需求電量。就轉化成了單源點單匯點的最大流問題了。剛學網路流,不成熟的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...