您的位置:首页 > 其它

hdu 4280 最大流

2013-09-01 22:58 288 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4280

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;

const int maxn = 100005;
const int maxe = 500000;
const int INF = 0x3f3f3f;

struct Edge{
int v,flow,cap;
int next;
Edge(int v=0,int flow=0,int cap=0,int next=0):
v(v) , flow(flow),  cap(cap),  next(next){}

};

struct Dinic{
Edge edges[maxe];
int head[maxn],cnt;
int cur[maxn];
int d[maxn];
int vis[maxn];
int s,t;

void init(){
memset(head,-1,sizeof(head));
cnt = 0;
}

void addedge(int u,int v,int cap){
edges[cnt] = Edge(v,0,cap,head[u]);
head[u] = cnt++;
edges[cnt] = Edge(u,0,cap,head[v]);
head[v] = cnt++;
}

bool bfs(){
memset(vis,0,sizeof(vis));
queue<int> Q;
Q.push(s);
vis[s] = true;
d[s] = 0;
while(!Q.empty()){
int u = Q.front();  Q.pop();
for(int i=head[u];i!=-1;i=edges[i].next){
Edge& e = edges[i];
if(!vis[e.v] && e.cap > e.flow){
vis[e.v] = true;
d[e.v] = d[u] + 1;
Q.push(e.v);
}
}
}
return vis[t];
}

int dfs(int u,int res){
if(u == t || res == 0)   return res;
int flow = 0,f;
for(int& i=cur[u];i!=-1;i=edges[i].next){
Edge& e = edges[i];
if(d[e.v] == d[u] + 1 && (f = dfs(e.v,min(res,e.cap-e.flow))) > 0){
e.flow += f;
edges[i^1].flow -= f;
flow += f;
res -= f;
if(res == 0) break;
}
}
return flow;
}

int MaxFlow(int s_,int t_){
s = s_;  t = t_;
int flow = 0;
while(bfs()){
for(int i=0;i<=maxn;i++)  cur[i] = head[i];
flow += dfs(s,INF);
}

return  flow;
}

}solver;

int main()
{
freopen("E:\\acm\\input.txt","r",stdin);
int T;
cin>>T;
while(T--){
solver.init();
int N,M;
cin>>N>>M;
int maxx=-INF,minx=INF;
int s,t;
for(int i=1;i<=N;i++){
int x,y;
scanf("%d %d",&x,&y);
if(maxx < x){
maxx = x;
t = i;
}
if(minx > x){
minx = x;
s = i;
}
}
for(int i=1;i<=M;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
solver.addedge(a,b,c);
}
printf("%d\n",solver.MaxFlow(s,t));
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: