设为首页 加入收藏

TOP

ZOJ 1698 (最大流入门)(二)
2015-07-20 17:32:01 来源: 作者: 【 】 浏览:7
Tags:ZOJ 1698 最大 入门
to]=min(a[u],e.cap-e.flow); } } } if(a[t]==0)return f; int x=t; while(x!=s){ edges[p[x]].flow+=a[t]; edges[p[x]^1].flow-=a[t]; x=edges[p[x]].from; } f+=a[t]; } return f; } int main()//多源多汇点,在前面加个源点,后面加个汇点,转成单源单汇点 { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int start,end; int np,nc,m; int u,v,z; while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF) { edges.clear(); for(int i=0;i<=n+1;i++)G[i].clear(); while(m--) { while(getchar()!='('); scanf("%d,%d)%d",&u,&v,&z); u++;v++; addedge(u,v,z); } while(np--) { while(getchar()!='('); scanf("%d)%d",&u,&z); u++; addedge(0,u,z); } while(nc--) { while(getchar()!='('); scanf("%d)%d",&u,&z); u++; addedge(u,n+1,z); } start=0; end=n+1; int ans=Ek(start,end); cout<

dinic算法版:

#include
                     
                      
#include
                      
                        #include
                       
                         #include
                        
                          #include
                         
                           using namespace std; const int INF=0x3f3f3f3f; const int MAXN=150;//点数的最大值 const int MAXM=20500;//边数的最大值 int n,a[MAXN],p[MAXN]; int cur[MAXN],d[MAXN],vis[MAXN]; struct Edge { int from,to,cap,flow; }; std::vector
                          
                           edges; std::vector
                           
                            G[MAXN]; void addedge(int u,int v,int w){ edges.push_back((Edge){u,v,w,0}); edges.push_back((Edge){v,u,0,0}); int m=edges.size(); G[u].push_back(m-2); G[v].push_back(m-1); } int bfs(int s,int t) { memset(vis,0,sizeof vis); queue
                            
                             q; q.push(s); vis[s]=1; d[s]=0; while(!q.empty()){ int u=q.front();q.pop(); for(int i=0;i
                             
                              e.flow){ q.push(e.to); vis[e.to]=1; d[e.to]=d[u]+1; } } } return vis[t]; } int dfs(int x,int a,int t){ if(x==t||a==0)return a; int flow=0,f=0; for(int &i=cur[x];i
                              
                               0){ e.flow+=f; edges[G[x][i]^1].flow-=f; flow+=f; a-=f; if(a==0)break; } } return flow; } int dinic(int s,int t){ int flow=0; while(bfs(s,t)){ memset(cur,0,sizeof cur); flow+=dfs(s,INF,t); } return flow; } int main()//多源多汇点,在前面加个源点,后面加个汇点,转成单源单汇点 { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int start,end; int np,nc,m; int u,v,z; while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF) { edges.clear(); for(int i=0;i<=n+1;i++)G[i].clear(); while(m--) { while(getchar()!='('); scanf("%d,%d)%d",&u,&v,&z); u++;v++; addedge(u,v,z); } while(np--) { while(getchar()!='('); scanf("%d)%d",&u,&z); u++; addedge(0,u,z); } while(nc--) { while(getchar()!='('); scanf("%d)%d",&u,&z); u++; addedge(u,n+1,z); } start=0; end=n+1; int ans=dinic(start,end); cout<
                               
                                

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Leetcode - CopyWithRandomList 下一篇POJ3187 Backward Digit Sums

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ Lambda表达式保 (2025-12-26 05:49:45)
·C++ Lambda表达式的 (2025-12-26 05:49:42)
·深入浅出 C++ Lambda (2025-12-26 05:49:40)
·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)