Hdu Flow Problem
2013-04-18 23:03
232 查看
View Code
http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1002&ojid=0&cid=4456&hide=0
直接求最大流问题
#include <iostream> #include<cstdio>//最大流SAP #include<cstring> #include<vector> #include<queue> #include<algorithm> using namespace std; #define min(a,b) ((a)<(b))?(a):(b) #define max(a,b) ((a)>(b))?(a):(b) #define MAXN 200 #define MAXM 10000+10//M取N的平方倍 #define INF 0x3f3f3f3f //链式前向星 struct enode { int t; int w; //权值 int c; //流量 // int cost; // int pre; //前向指针 int next; }; struct lstar { struct enode e[MAXM]; int box[MAXN],ecnt; //int etail[MAXN]; //尾部 void init() { ecnt=0; memset(box,-1,sizeof(box)); // memset(etail,-1,sizeof(etail)); //初始化尾部 } void addedge(int f,int t,int c) //流量重载 { e[ecnt].next=box[f]; e[ecnt].t=t; e[ecnt].c=c; box[f]=ecnt++; e[ecnt].next=box[t]; e[ecnt].t=f; e[ecnt].c=0; box[t]=ecnt++; } }; int sap(int s,int t,lstar G,int N)//最大流问题 { int gap[MAXN],lvl[MAXN],cur[MAXN],pre[MAXN]; int curflow,ans=0,u,tmp,neck,i; memset(lvl,0,sizeof(lvl)); memset(gap,0,sizeof(gap)); memset(pre,-1,sizeof(pre)); for(i=0;i<N;i++) cur[i]=G.box[i]; gap[0]=N; u=s; while(lvl[s]<N) { if(u==t) { curflow=INF; for(i=s;i!=t;i=G.e[cur[i]].t) { if(curflow>G.e[cur[i]].c) { neck=i; curflow=G.e[cur[i]].c; } } for(i=s;i!=t;i=G.e[cur[i]].t) { tmp=cur[i]; G.e[tmp].c-=curflow; G.e[tmp^1].c+=curflow; } ans+=curflow; u=neck; } for(i=cur[u];i!=-1;i=G.e[i].next) if(G.e[i].c && lvl[u]==lvl[G.e[i].t]+1) break; if(i!=-1) { cur[u]=i; pre[G.e[i].t]=u; u=G.e[i].t; } else { if(--gap[lvl[u]]==0) break; cur[u]=G.box[u]; for(tmp=N,i=G.box[u];i!=-1;i=G.e[i].next) if(G.e[i].c) tmp=min(tmp,lvl[G.e[i].t]); lvl[u]=tmp+1; gap[lvl[u]]++; if(u!=s) u=pre[u]; } } return ans; } int main() { int m,n,t; lstar s; scanf("%d",&t); int ct=1; while(t--) { int a,b,cost; cin>>n>>m; // memset(map,0,sizeof(map)); s.init(); for(int i=0;i<m;i++) { cin>>a>>b>>cost; s.addedge(a-1,b-1,cost); }//参数含义:源点 汇点 网络结点数量 //printf("####\n"); /* for(int i=1;i<=n;i++) { for(int k=s.box[i];k!=-1;k=s.e[k].next) cout<<i<< " " <<s.e[k].t<< " " <<s.e[k].c<<endl; }//*/ cout<<"Case "<<ct++<<":"; cout<<" "<<sap(0,n-1,s,n)<<endl;//最大流问题 } return 0; } /* 2 3 2 1 2 1 2 3 1 3 3 1 2 1 2 3 1 1 3 1 Case 1: 1 Case 2: 2 */
http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1002&ojid=0&cid=4456&hide=0
直接求最大流问题
相关文章推荐
- hdu(3549)Flow Problem
- HDU 3549 Flow Problem
- HDU 3549 适合网络流入门(内含sap模板和Dinic模板)Flow Problem
- hdu Flow Problem (最大流 裸题)
- Problem G:免费馅饼(HDU 1176)
- HDU - 5572 An Easy Physics Problem(计算几何)
- hdu 3706 Second My Problem First
- http://acm.hdu.edu.cn/showproblem.php?pid=1203(背包问题)
- hdu 4403 A very hard Aoshu problem【dfs枚举】
- 递推 HDU Problem K 骨牌铺方格
- HDU 1757 A Simple Math Problem 题解与分析
- 【HDU 4973 多校联合】A simple simulation problem【树状数组】
- HDU1016——Prime Ring Problem
- hdu 4627 The Unsolvable Problem【hdu2013多校3签到】
- Math Problem HDU - 5105 暴力求解/公式
- HDU 4267 The Unsolvable Problem
- ACM_HDU_1000_A + B Problem
- hdu 4291 A Short problem(矩阵+取模循环节)
- HDU5974 A Simple Math Problem---数论--转化解方程
- Problem R:Big Event in HDU(HDU 1171)