poj 1273:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h> //tower()
#include<set>
#include<map>
#include<string.h>
#include<iomanip>// cout<<setprecision(1)<<fixed<<a;
#include<vector>
#include<time.h>
#include<assert.h> //assert
#include<math.h>
#include<algorithm>
#include<bitset>
#include<limits.h>
#include<stack>
#include<queue>
using namespace std;
const int maxn=210;
const int maxm=210;
const int inf=INT_MAX;
struct edge{
int to;//终点
int cap;//容量
int rev;//反向边
};
int n,m;
vector <edge> g[maxn];
bool used[maxn];
//向图中增加一条从s到t容量为cap的边
void add_edge(int from,int to,int cap){
g[from].push_back((edge){to,cap,g[to].size()});
g[to].push_back((edge){from,0,g[from].size()-1});
}
//寻找增广路
int dfs(int v,int t,int f){
if(v==t) return f;
used[v]=true;
for(int i=0;i<g[v].size();++i){
edge &e=g[v][i];
if(!used[e.to]&&e.cap>0){
int d=dfs(e.to,t,min(f,e.cap));
if(d>0){
e.cap-=d;
g[e.to][e.rev].cap+=d;
return d;
}
}
}
return 0;
}
int max_flow(int s,int t){
int flow=0;
for(;;){
memset(used,0,sizeof(used));
int f=dfs(s,t,inf);
if(f==0) return flow;
flow+=f;
}
}
int main(){///588K 16MS
int a,b,c;
while(~scanf("%d%d",&n,&m)){
for(int i=0;i<=m;++i) g[i].clear();
for(int i=0;i<n;++i){
scanf("%d%d%d",&a,&b,&c);
add_edge(a,b,c);
}
printf("%d\n",max_flow(1,m));
}
return 0;
}
hdu 3549:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h> //tower()
#include<set>
#include<map>
#include<string.h>
#include<iomanip>// cout<<setprecision(1)<<fixed<<a;
#include<vector>
#include<time.h>
#include<assert.h> //assert
#include<math.h>
#include<algorithm>
#include<bitset>
#include<limits.h>
#include<stack>
#include<queue>
using namespace std;
const int maxn=20;
const int maxm=1510;
const int inf=INT_MAX;
struct edge{
int to;//终点
int cap;//容量
int rev;//反向边
};
int n,m,t;
vector <edge> g[maxn];
bool used[maxn];
//向图中增加一条从s到t容量为cap的边
void add_edge(int from,int to,int cap){
g[from].push_back((edge){to,cap,g[to].size()});
g[to].push_back((edge){from,0,g[from].size()-1});
}
//寻找增广路
int dfs(int v,int t,int f){
if(v==t) return f;
used[v]=true;
for(int i=0;i<g[v].size();++i){
edge &e=g[v][i];
if(!used[e.to]&&e.cap>0){
int d=dfs(e.to,t,min(f,e.cap));
if(d>0){
e.cap-=d;
g[e.to][e.rev].cap+=d;
return d;
}
}
}
return 0;
}
int max_flow(int s,int t){
int flow=0;
for(;;){
memset(used,0,sizeof(used));
int f=dfs(s,t,inf);
if(f==0) return flow;
flow+=f;
}
}
int main(){///171MS 1580K
int a,b,c;
scanf("%d",&t);
int cas=1;
while(cas<=t){
scanf("%d%d",&n,&m);
for(int i=0;i<=n;++i) g[i].clear();
for(int i=0;i<m;++i){
scanf("%d%d%d",&a,&b,&c);
add_edge(a,b,c);
}
printf("Case %d: %d\n",cas++,max_flow(1,n));
}
return 0;
}