为什么这样改就正确了
查看原帖
为什么这样改就正确了
482730
aSunnyDay楼主2022/6/17 13:20

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;
}

我只改了建图的部分,dinic没有改,所以请问建图哪里建错了,谢谢!

2022/6/17 13:20
加载中...