AC代码
#include<bits/stdc++.h>
#define idL(i) i
#define idR(i) (i+n)
using namespace std;
typedef long long ll;
const ll N=209;
const ll M=1209;
const ll INF=1e15;
ll n,m,S,T,lv[2*N],hd[2*N],cnt=1,cur[2*N];
struct edge{ll to,w,nxt;}es[2*N+4*M];
void ad(ll x,ll y,ll w){es[++cnt]=(edge){y,w,hd[x]},hd[x]=cnt;}
void add(ll x,ll y,ll w,ll v=0){ad(x,y,w);ad(y,x,v);}
ll bfs(){
queue<ll> q;
q.push(S);
memset(lv,0,sizeof(lv));
lv[S]=1;
while(!q.empty()){
ll x=q.front();q.pop();
for(ll i=hd[x],v;i;i=es[i].nxt)
if(!lv[v=es[i].to]&&es[i].w)
q.push(v),lv[v]=lv[x]+1;
}
return lv[T];
}
ll dfs(ll x,ll flow){
if(x==T) return flow;
ll sum=0;
for(ll i=hd[x],v,w;i&&flow;i=es[i].nxt){
cur[x]=i;
if((w=es[i].w)&&lv[v=es[i].to]==lv[x]+1){
ll res=dfs(v,min(flow,w));
sum+=res,flow-=res;
es[i].w-=res,es[i^1].w+=res;
}
}
return sum;
}
ll dinic(){
ll sum=0;
while(bfs()){
for(ll i=idL(1);i<=idR(n);++i) cur[i]=hd[i];
sum+=dfs(S,INF);
}
return sum;
}
int main(){
cin>>n>>m>>S>>T;
for(ll i=1;i<=n;++i) if(i^S&&i^T) add(idL(i),idR(i),1);
S+=n;
for(ll i=1;i<=m;++i){
ll x,y;
cin>>x>>y;
add(idR(x),idL(y),1),
add(idR(y),idL(x),1);
}
// for(ll i=1;i<=2*n;++i){
// for(ll j=hd[i];j;j=es[j].nxt)
// if(es[j].w)cout<<i<<" "<<es[j].to<<" "<<es[j].w<<"\n";
// }
cout<<dinic();
return 0;
}
90分代码
#include<bits/stdc++.h>
#define idL(i) i
#define idR(i) (i+n)
using namespace std;
typedef long long ll;
const ll N=109;
const ll M=609;
const ll INF=1e15;
ll n,m,S,T,lv[2*N],hd[2*N],cnt=1,cur[2*N];
struct edge{ll to,w,nxt;}es[2*N+4*M];
void ad(ll x,ll y,ll w){es[++cnt]=(edge){y,w,hd[x]},hd[x]=cnt;}
void add(ll x,ll y,ll w,ll v=0){ad(x,y,w);ad(y,x,v);}
ll bfs(){
queue<ll> q;
q.push(S);
memset(lv,0,sizeof(lv));
lv[S]=1;
while(!q.empty()){
ll x=q.front();q.pop();
for(ll i=hd[x],v;i;i=es[i].nxt)
if(!lv[v=es[i].to]&&es[i].w)
q.push(v),lv[v]=lv[x]+1;
}
return lv[T];
}
ll dfs(ll x,ll flow){
if(x==T) return flow;
ll sum=0;
for(ll i=hd[x],v,w;i&&flow;i=es[i].nxt){
cur[x]=i;
if((w=es[i].w)&&lv[v=es[i].to]==lv[x]+1){
ll res=dfs(v,min(flow,w));
sum+=res,flow-=res;
es[i].w-=res,es[i^1].w+=res;
}
}
return sum;
}
ll dinic(){
ll sum=0;
while(bfs()){
for(ll i=idL(1);i<=idR(n);++i) cur[i]=hd[i];
sum+=dfs(S,INF);
}
return sum;
}
int main(){
cin>>n>>m>>S>>T;
for(ll i=1;i<=n;++i) if(i^S&&i^T) add(idL(i),idR(i),1);
for(ll i=1;i<=m;++i){
ll x,y;
cin>>x>>y;
if(x>y) swap(x,y);
if(x==S)
add(S,idL(y),1);
if(y==T)
add(idR(y),T,1);
else{
add(idR(x),idL(y),1),
add(idR(y),idL(x),1);
}
}
// for(ll i=1;i<=2*n;++i){
// for(ll j=hd[i];j;j=es[j].nxt)
// if(es[j].w)cout<<i<<" "<<es[j].to<<" "<<es[j].w<<"\n";
// }
cout<<dinic();
return 0;
}