求最大流算法dinic 2
#include<stdio.h> // 最大流 Dinic 模版 2
#include<string.h>
#include<algorithm>
using namespace std;
#include<vector>
#define INF 0x3f3f3f3f
#include<queue>
struct node
{
int to,cap,rev;
};
vector<node> v[300];
int n,m;
int level[300];
//int iter[1100];
void init()
{
for(int i=0;i<=n;i++)
v[i].clear();
}
void bfs(int s)
{
memset(level,-1,sizeof(level));
level[s]=0;
queue<int> q;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=0;i<v[u].size();i++)
{
node e=v[u][i];
if(e.cap>0&&level[e.to]<0)
{
level[e.to]=level[u]+1;
q.push(e.to);
}
}
}
}
int dfs(int x,int t,int f)
{
if(x==t)
return f;
int s=f;
for(int i=0;i<v[x].size();i++)
{
node &e=v[x][i];
if(e.cap>0&&level[e.to]==level[x]+1)
{
int k=dfs(e.to,t,min(f,e.cap));
if(k>0)
{
e.cap-=k;
v[e.to][e.rev].cap+=k;
f=f-k;
}
}
}
return s-f;
}
int main()
{
int i,j,k,t;
while(~scanf("%d%d",&m,&n))
{
init();
int star,end,cap;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&star,&end,&cap);
v[star].push_back((node){end,cap,v[end].size()});
v[end].push_back((node){star,0,v[star].size() - 1});
}
int flow=0;
while(1)
{
bfs(1);
if(level[n]<0)
break;
//memset(iter,0,sizeof(iter));
//int f;
//while((f=dfs(1,n,INF))>0)
//flow+=f;
flow+=dfs(1,n,INF);
}
printf("%d\n",flow);
}
return 0;
}
#include<stdio.h> // 最大流 Dinic 模版
#include<string.h>
#include<algorithm>
using namespace std;
#include<vector>
#define INF 0x3f3f3f3f
#include<queue>
struct node
{
int to,cap,rev;
};
vector<node> v[300];
int n,m;
int level[300];
int iter[1100];
void init()
{
for(int i=0;i<=n;i++)
v[i].clear();
}
void bfs(int s)
{
memset(level,-1,sizeof(level));
level[s]=0;
queue<int> q;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=0;i<v[u].size();i++)
{
node e=v[u][i];
if(e.cap>0&&level[e.to]<0)
{
level[e.to]=level[u]+1;
q.push(e.to);
}
}
}
}
int dfs(int x,int t,int f)
{
if(x==t)
return f;
for(int &i=iter[x];i<v[x].size();i++)
{
node &e=v[x][i];
if(e.cap>0&&level[e.to]==level[x]+1)
{
int k=dfs(e.to,t,min(f,e.cap));
if(k>0)
{
e.cap-=k;
v[e.to][e.rev].cap+=k;
return k;
}
}
}
return 0;
}
int main()
{
int i,j,k,t;
while(~scanf("%d%d",&m,&n))
{
init();
int star,end,cap;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&star,&end,&cap);
v[star].push_back((node){end,cap,v[end].size()});
v[end].push_back((node){star,0,v[star].size() - 1});
}
int flow=0;
while(1)
{
bfs(1);
if(level[n]<0)
break;
memset(iter,0,sizeof(iter));
int f;
while((f=dfs(1,n,INF))>0)
flow+=f;
}
printf("%d\n",flow);
}
return 0;
}
565

被折叠的 条评论
为什么被折叠?



