这是一号代码:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 10010, E = 200010;
int n,m;
int head[N];
int to[E],nxt[E],val[E];
int cnt=1;
bool vis[N];
void add(int u, int v, int w)
{
cnt++;
to[cnt] = v;
val[cnt] = w;
nxt[cnt] = head[u];
head[u] = cnt;
}
int FF(int u,int flow)
{
if (u==t)
{
return flow;
}
vis[u]=1;
for(int p=head[u];p;p=nxt[p])
{
int v=to[p];
if (val[p]==0||vis[v])
{
continue;
}
int res = 0;
if( (res = EK ( v, min (flow, val[p]) ) ) > 0)
{
val[p] -= res;
val[p ^ 1] += res;
return res;
}
}
return 0;
}
int main()
{
int i,j,k;
cin>>n>>m;
s=1;
t=n;
for(i=1;i<=m;i++)
{
int u, v, w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,0);
}
int res = 0, tot = 0;
while (memset(vis, 0, sizeof(vis)) and (res = FF, 2e9)) > 0)
{
tot += res;
}
cout<<tot;
return 0;
}
这是2号代码:
#include <iostream>
#include <cstring>
using namespace std;
int n,m,s,t;
struct edge
{
int to,next,dis;
}e[100005];
int cnt=1,head[100005];
void add(int x,int y,int z)
{
cnt++;
e[cnt].to=y;
e[cnt].dis=z;
e[cnt].next=head[x];
head[x]=cnt;
}
int vis[100005];
int FF(int x,int flow)
{
if(x==t)return flow;
vis[x]=1;
for(int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(e[i].dis==0||vis[v])continue;
int res=0;
if(res=FF(v,min(flow,e[i].dis))>0)
{
e[i].dis-=res;
e[i^1].dis+=res;
return res;
}
}
return 0;
}
int main()
{
int i,j,k;
cin>>n>>m;
s=1;
t=n;
for(i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,0);
}
int ans=0,res=0;
while(res=FF(s,10000)>0)
{
memset(vis,0,sizeof(vis));
ans+=res;
}
cout<<ans;
return 0;
}
这是3号代码
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int n,m,s,t;
struct edge
{
int to,next,dis;
}e[100005];
int cnt=1,head[100005];
void add(int x,int y,int z)
{
cnt++;
e[cnt].to=y;
e[cnt].dis=z;
e[cnt].next=head[x];
head[x]=cnt;
return ;
}
int vis[100005];
int d[100005];
int bfs()
{
queue<int> q;
q.push(s);
d[s]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(e[i].dis&&!d[v])
{
d[v]=d[x]+1;
if(v==t)return 1;
q.push(v);
}
}
}
return 0;
}
int EK(int x,int flow)
{
if(x==t)return flow;
for(int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(e[i].dis==0||d[v]!=d[x]+1)continue;
int res=0;
if(res=EK(v,min(flow,e[i].dis))>0)
{
e[i].dis-=res;
e[i^1].dis+=res;
return res;
}
}
return 0;
}
int main()
{
int i,j,k;
cin>>n>>m;
s=1;
t=n;
for(i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,0);
}
int ans=0,res=0;
while(bfs())
{
ans+=EK(s,2e11);
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
}
cout<<ans;
return 0;
}
萌新有几个问题: