POJ1459 - 多源点多汇点的网络流

多源点多汇点的网络流其实处理方法很简单...给所有源点加一个超级源点...给所有汇点加一个超级汇点...然后赤果果的最大流....

/* POJ1459 多源点多汇点最大流..Dinic模板题.. */ #include<iostream> using namespace std; const int oo=2000000000; int n,np,nc,m,Network[110][110],Road[110],Dis[110],ans; bool FindARoad; int BFS() { int Myqueue[110],h,p,i; bool used[110]; memset(Dis,0,sizeof(Dis)); memset(used,false,sizeof(used)); Dis[1]=1; used[1]=true; h=p=1; Myqueue[1]=1; while (h<=p) { for (i=1;i<=n;i++) if (!used[i] && Network[Myqueue[h]][i]) { p++; Myqueue[p]=i; used[i]=true; Dis[i]=Dis[Myqueue[h]]+1; } h++; } return Dis[n]; } void DFS(int num,int Lroad,int MinFlow) { int i; Road[Lroad]=num; if (num==n) { ans+=MinFlow; FindARoad=true; for (i=1;i<Lroad;i++) { Network[Road[i]][Road[i+1]]-=MinFlow; Network[Road[i+1]][Road[i]]+=MinFlow; } return; } for (i=1;i<=n;i++) if (Dis[i]-Dis[num]==1 && Network[num][i] ) { DFS(i,Lroad+1,MinFlow<Network[num][i]?MinFlow:Network[num][i]); if (FindARoad) { if (!Network[num][i]) FindARoad=false; return; } } } void Dinic() { while (BFS()) { FindARoad=false; DFS(1,1,oo); } } int main() { freopen("1459.in","r",stdin); freopen("1459.out","w",stdout); while (scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF) { n+=2; memset(Network,0,sizeof(Network)); int x,y,i,d; char c; for (i=1;i<=m;i++) { scanf("%c",&c); while (c!='(') scanf("%c",&c); ; scanf("%d%c",&x,&c); while (c!=',') scanf("%c",&c); scanf("%d%c",&y,&c); while (c!=')') scanf("%c",&c); scanf("%d",&d); Network[x+2][y+2]+=d; } for (i=1;i<=np;i++) { scanf("%c",&c); while (c!='(') scanf("%c",&c); ; scanf("%d%c",&x,&c); while (c!=')') scanf("%c",&c); scanf("%d",&d); Network[1][x+2]+=d; } for (i=1;i<=nc;i++) { scanf("%c",&c); while (c!='(') scanf("%c",&c); ; scanf("%d%c",&x,&c); while (c!=')') scanf("%c",&c); scanf("%d",&d); Network[x+2][n]+=d; } ans=0; Dinic(); printf("%d\n",ans); } return 0; }
为毛我的Dinic速度不大给力??请大牛指导~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值