p=0 WA On #6-10求助
查看原帖
p=0 WA On #6-10求助
881015
Resstifnurvˆwˆ.tar.gz楼主2023/12/2 19:33

太玄了,累了,毁灭吧

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

inline int read(){
	int ret=0;
	char ch=' ',c=getchar();
	while(!('0'<=c&c<='9')) ch=c,c=getchar();
	while('0'<=c&&c<='9') ret=(ret<<1)+(ret<<3)+(c^48),c=getchar();
	return ch=='-'?-ret:ret;
}

int n,m;
int S,T;
const int N=1e3+10,M=1e5+10;

int to[M],nt[M],c[M],idx,h[N],cur[N];
inline void add(int x,int y,int z){
	to[idx]=y,nt[idx]=h[x],c[idx]=z,h[x]=idx++;
	to[idx]=x,nt[idx]=h[y],c[idx]=0,h[y]=idx++;
}

int lv[N];
int q[N],tt=-1,hh=0;

bool bfs(){
	memset(lv,-1,sizeof(lv));
	hh=0,tt=-1;
	q[++tt]=S;
	lv[S]=0;
	cur[S]=h[S];
	while(hh<=tt){
		int u=q[hh++];
		for(int i=h[u];i!=-1;i=nt[i]){
			int j=to[i];
			if(lv[j]!=-1||c[i]==0) continue;
			q[++tt]=j;
			lv[j]=lv[u]+1;
			cur[j]=h[j];
			if(j==T) return true;
		}
	}
	return false;
}

int find(int u,int limit){
	if(u==T) return limit;
	int flow=0;
	for(int i=cur[u];i!=-1;i=nt[i]){
		int j=to[i];
		cur[u]=i;
		if(lv[j]!=lv[u]+1||c[i]==0) continue;
		int k=find(j,min(c[i],limit-flow));
		if(k==0) lv[j]=-1;
		flow+=k;
		c[i]-=k;
		c[i^1]+=k;
	}
	return flow;
}

int dinic(){
	int ans=0,flow=0;
	while(bfs()){
		while(flow=find(S,0x7f7f7f7f)) ans+=flow;
	}
	return ans;
}

void show_ans(int id){
	for(int t=h[id];t!=-1;t=nt[t]){
		int j=to[t];
		if(m+1<=j&&j<=m+n&&c[t]==0){
			printf("\n%d",j-m-1);
			return ;
		}
	}
}

int main(){
	memset(h,-1,sizeof(h));
	n=read(),m=read();
	S=0,T=n+m+1;
	for(int i=1;i<=n;i++) add(i+m,T,1);
	int flow=0,pre;
	for(int i=1;i<=m;i++){
		add(S,i,1);
		add(i,read()+1+m,1);
		add(i,read()+1+m,1);
		flow+=dinic();
		if(flow<i){
			printf("%d",i-1);
			for(int u=1;u<i;u++) show_ans(u);
			return 0;
		}
	}
	printf("%d",m);
	for(int u=1;u<=m;u++) show_ans(u);
	return 0;
}
2023/12/2 19:33
加载中...