您的位置:首页 > 其它

【poj1459】Power Network【模板题】【最大流】

2015-02-18 14:38 405 查看
传送门:http://poj.org/problem?id=1459

别的没啥好说的,就是另设一个超级源S和超级汇T,把所有Power Station连到S上,把所有Consumer连到T上,然后Dinic一下就行了~

(我数组又开小了T_T)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
struct Dinic{
#define fill(x,y) memset(x,y,sizeof(x))
static const int maxn=110;
int s,t,tot;
typedef int arr[maxn*maxn<<1];//FUCK。。。又开小了。。
arr cap,flow,toit,next;
bool visit[maxn];
int cur[maxn];
int dis[maxn];
int list[maxn];
Dinic():tot(0){
fill(cap,0);
fill(flow,0);
fill(toit,0);
fill(next,-1);
fill(visit,false);
fill(cur,-1);
fill(dis,0);
fill(list,-1);
}
inline void add(int from,int to,int _cap){
next[tot]=list[from];
list[from]=tot;
toit[tot]=to;
cap[tot]=_cap;
tot++;
}
inline bool bfs(){
queue<int>q;
fill(visit,false);
q.push(s);
visit[s]=true;
dis[s]=0;
int h;
while(!q.empty()){
h=q.front();
q.pop();
for(int k=list[h];k!=-1;k=next[k]){
if(!visit[toit[k]]&&cap[k]>flow[k]){
visit[toit[k]]=true;
dis[toit[k]]=dis[h]+1;
q.push(toit[k]);
}
}
}
return visit[t];
}
inline int dfs(int x,int a){
if(x==t||!a) return a;
int Flow=0,f;
for(int &i=cur[x];i!=-1;i=next[i]){
int to=toit[i];
if(dis[to]==dis[x]+1&&(f=dfs(to,min(a,cap[i]-flow[i])))>0){
flow[i]+=f;
flow[i^1]-=f;
Flow+=f;
a-=f;
if(!a) break;
}
}
return Flow;
}
inline int maxFlow(int s,int t){
this->s=s,this->t=t;
int ans=0;
while(bfs()){
//			cout<<"hehe";
memcpy(cur,list,sizeof cur);
ans+=dfs(s,0x1f1f1f1f);
}
return ans;
}
};
int main(){
int n,np,nc,m,u,v,z;
while(scanf("%d%d%d%d",&n,&np,&nc,&m)==4){
Dinic QuestionAnswer;
while(m--){
scanf("%*[\n (]%d%*[,]%d%*[)]%d%*[ \n]",&u,&v,&z);
QuestionAnswer.add(u,v,z);
QuestionAnswer.add(v,u,0);
}
while(np--){
scanf("%*[\n (]%d%*[)]%d%*[ \n]",&u,&z);
QuestionAnswer.add(n+1,u,z);
QuestionAnswer.add(u,n+1,0);
}
while(nc--){
scanf("%*[\n (]%d%*[)]%d%*[ \n]",&u,&z);
QuestionAnswer.add(n+2,u,0);
QuestionAnswer.add(u,n+2,z);
}
printf("%d\n",QuestionAnswer.maxFlow(n+1,n+2));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: