| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
[[在线等球解释]]为什么注释掉的dfs两次的方法不对?0边也试过了。。#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=50005;
int head[515],lv[515],ver[N],next[N],f[N],tot,S,T,Q[N];
bool v[515];
void add(int x,int y,int z)
{
ver[++tot]=y,f[tot]=z,next[tot]=head[x],head[x]=tot;
ver[++tot]=x,f[tot]=0,next[tot]=head[y],head[y]=tot;
}
bool tell()
{
int i,x,y,l=0,r=0;
memset(lv,-1,sizeof(lv));
lv[Q[0]=S]=0;
while(l<=r)
{
x=Q[l++];
for(i=head[x];i!=-1;i=next[i])
if(lv[y=ver[i]]==-1&&f[i])
lv[y]=lv[x]+1,Q[++r]=y;
}
if(lv[T]==-1) return 0;
return 1;
}
int zeng(int x,int less)
{
if(x==T) return less;
int r,use=0,i,y;
for(i=head[x];i!=-1&&less;i=next[i])
if(lv[y=ver[i]]==lv[x]+1&&f[i])
r=zeng(y,min(less,f[i])),use+=r,less-=r,f[i]-=r,f[i^1]+=r;
if(!use) lv[x]=-1;
return use;
}
int dinic()
{
int sum=0;
while(tell()) sum+=zeng(S,0x7f7f7f7f);
return sum;
}
/*
void dfs(int x,int p)
{
v[x]=1;
int i;
for(i=head[x];i!=-1;i=next[i])
{
if(i%2==p&&f[i^p]&&!v[ver[i]]) dfs(ver[i],p);
}
return ;
}
*/
int main()
{
memset(head,-1,sizeof(head));
tot=-1;
int i,x,y,z,ans=0,n,m;
scanf("%d%d",&n,&m);
S=0,T=n-1;
for(i=1;i<=m;i++)
scanf("%d%d%d",&x,&y,&z),add(x,y,z);
dinic();
/*
dfs(S,0);
dfs(T,1);
for(i=0;i<=tot;i+=2)
if(!f[i]&&v[ver[i]]&&v[ver[i^1]])
ans++,cout<<ver[i]<<' '<<ver[i^1]<<endl;
*/
for(i=0;i<=tot;i+=2)
{
if(!f[i])
{
f[i]++;
if(tell())ans++;
f[i]--;
}
}
printf("%d",ans);
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator