Connection
Description
给定一张
N
个点
Data Constraint
N
<=
Solution
题目要求求出无向图的最小割,我们无法知道哪一个点在
S
集,哪个在
时间复杂度 O(?n)
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,j,l) for(int i=j;i<=l;++i)
#define fd(i,j,l) for(int i=j;i>=l;--i)
using namespace std;
typedef long long ll;
const ll N=500;
int f[N][N],g[N][N];
int b[N][N],gs[N],d[N];
int S,T,n,m,j,k,l,x,y;
int h[N],vh[N];
inline int min(int a,int b)
{return a<b?a:b;}
int flow(int o,int op)
{
if(o==n)return op;
int minh=n+1;
fo(i,1,gs[o]){
d[o]=d[o]==gs[o]?1:d[o]+1;
int y=b[o][d[o]];
if(g[o][y]){
if(h[o]==h[y]+1){
int zd=flow(y,min(op,g[o][y]));
if(zd){
g[o][y]-=zd;
g[y][o]+=zd;
return zd;
}
if(h[S]>n)return 0;
}
minh=min(h[y]+1,minh);
}
}
if(!--vh[h[o]])h[S]=n+1;
h[o]=minh; ++vh[h[o]];
return 0;
}
int main()
{
cin>>n>>m;
fo(i,1,m){
scanf("%d%d",&x,&y);
++f[x][y]; ++f[y][x];
b[x][++gs[x]]=y; b[y][++gs[y]]=x;
}
int ans=m;
fo(k,1,n-1){
S=k;
fo(i,1,n)fo(l,1,gs[i])g[i][b[i][l]]=f[i][b[i][l]];
vh[0]=n; int lj=0; fo(i,1,n)vh[i]=0,h[i]=0;
while(h[S]<=n)lj=lj+flow(S,m+1);
ans=min(ans,lj);
}
cout<<ans;
}