求调!!!
查看原帖
求调!!!
353967
baoyangawa楼主2023/11/27 20:27

AcWing上过了,这里一直莫名WA,请好心人帮忙看看哪写挂了!!谢谢!!

#include<bits/stdc++.h>
#define fr(a) freopen(a,"r",stdin)
#define fw(a) freopen(a,"w",stdout)
using namespace std;
typedef long long ll;
const int N=210,M=2e4+10,INF=0x3f3f3f3f;
struct node{
	ll v,w,nxt;
}edge[M],ZERO;
ll n,m,head[N],tot,s,t,res,u[N],v[N];
ll d[N],now[N];
void add(ll u,ll v,ll w){
	edge[++tot]=(node){v,w,head[u]};
	head[u]=tot;
}
void Init(){
	memset(head,0,sizeof head);
	res=INF;tot=1;
}
bool bfs(){
	memset(d,0,sizeof d);
	queue <ll> q;
	q.push(s+n);d[s+n]=1;now[s+n]=head[s+n];
	while(q.size()){
		ll x=q.front();q.pop();
		for(int i=head[x];i;i=edge[i].nxt){
			ll vv=edge[i].v,ww=edge[i].w;
			if(ww && !d[vv]){
				q.push(vv);d[vv]=d[x]+1;
				now[vv]=head[vv];
				if(vv==t) return true;
			}
		}
	}return false;
}
ll dinic(ll x,ll flow){
	if(x==t) return flow;
	ll rest=flow,k;
	for(int i=now[x];i&&rest;i=edge[i].nxt){
		ll vv=edge[i].v,ww=edge[i].w;
		if(ww && d[vv]==d[x]+1){
			k=dinic(vv,min(rest,ww));
			if(!k) d[vv]=0;
			edge[i].w-=k,edge[i^1].w+=k;
			rest-=k;
		}now[x]=i;
	}return flow-rest;
}
int main(){
	while(cin>>n>>m){
		Init();
		for(int i=1;i<=m;i++){
			char c;cin>>c;
			scanf("%lld,%lld",&u[i],&v[i]);cin>>c;
			u[i]++,v[i]++;
		}
		for(s=1;s<=n;s++){
			for(t=s+1;t<=n;t++){
				for(int i=1;i<=tot;i++) edge[i]=ZERO;
				memset(head,0,sizeof head);
				tot=1;
				for(int i=1;i<=n;i++){
					if(i!=s&&i!=t) add(i,i+n,1),add(i+n,i,0);
				}
				for(int i=1;i<=m;i++){
					add(u[i]+n,v[i],INF),add(v[i],u[i]+n,0);
					add(v[i]+n,u[i],INF),add(u[i],v[i]+n,0);
				}
				ll ans=0,flag;
				while(bfs()){
					while(flag=dinic(s+n,INF)) ans+=flag;
				}
				res=min(res,ans);
			}
		}
		if(n<=1) res=n; 
		cout<<min(res,n)<<endl; 
	}
	return 0;
}

2023/11/27 20:27
加载中...