萌新刚学OI,请问为什么WA了?
查看原帖
萌新刚学OI,请问为什么WA了?
128269
字如其人楼主2021/5/26 21:50

数量就有错。

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int s=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
	return s*w;
}
const int N=2e4+5,M=3e5+5,inf=1e9;
int n,m,head[N],nxt[M],ver[M],edge[M],tot,e[M],s,t;
inline void add(int x,int y,int z){
	ver[++tot]=y,edge[tot]=z,nxt[tot]=head[x],head[x]=tot;
	ver[++tot]=x,edge[tot]=0,nxt[tot]=head[y],head[y]=tot;
}
int dep[N],now[N]; 
queue <int> q;
inline bool bfs(){
	memset(dep,0,sizeof(dep));
	while(q.size())q.pop();
	q.push(s);dep[s]=1;now[s]=head[s];
	while(q.size()){
		int x=q.front();q.pop();
		for(int i=now[x];i;i=nxt[i]){
			int y=ver[i],z=edge[i];
			if(z&&!dep[y]){
				q.push(y);
				dep[y]=dep[x]+1;
				now[y]=head[y];
				if(y==t)return true;
			}
    	}
	}
	return false;
}
int dinic(int x,int flow){
	if(x==t)return flow;
	int i,k,rest=flow;
	for(i=now[x];i&&rest;i=nxt[i]){
		if(dep[ver[i]]==dep[x]+1&&edge[i]){
			k=dinic(ver[i],min(flow,edge[i]));
			if(!k)dep[ver[i]]=0;
			edge[i]-=k,edge[i^1]+=k,rest-=k;
		}
	}
	now[x]=i;
	return flow-rest;
}
int hc[N],vc[M],nc[M],tc;
inline void add_c(int x,int y){vc[++tc]=y,nc[tc]=hc[x],hc[x]=tc;}
inline void addedge(){
	for(int i=1;i<=m;i++){
		if(!edge[e[i]])add_c(ver[e[i]],ver[e[i]^1]);
		else add_c(ver[e[i]^1],ver[e[i]]);
	}
	for(int i=1;i<=n;i++){
		if(!edge[4*i-2])add_c(i,s);else add_c(s,i);
		if(!edge[4*i])add_c(t,i+n);else add_c(n+i,t);
	}
}
int low[N],dfn[N],sta[N],c[N],num,top,cnt;
bool ins[N];
void tarjan(int x){
	low[x]=dfn[x]=++num;
	ins[x]=true,sta[++top]=x;
	for(int i=hc[x];i;i=nc[i]){
		if(!dfn[vc[i]]){
			tarjan(vc[i]);
			low[x]=min(low[x],low[vc[i]]);
		}
		else if(ins[vc[i]])low[x]=min(low[x],dfn[vc[i]]);
	}
	if(dfn[x]==low[x]){
		int y;cnt++;
		do{y=sta[top--],c[y]=cnt,ins[y]=false;}while(x!=y);
	}
}
struct ANS{
	int x,y;
	bool operator <(const ANS X)const{
		if(X.x==x)return  y<X.y;
		return x<X.x;
	}
}ans[M];
int main(){
	tot=1;
	n=read(),m=read();
	s=0,t=2*n+1;
	for(int i=1;i<=n;i++)add(s,i,1),add(i+n,t,1);
	for(int i=1;i<=m;i++){
		int x=read(),y=read();
		add(x,y+n,1),e[i]=tot;
	}
	while(bfs())while(dinic(s,inf));
	addedge();
	for(int i=s;i<=t;i++)
		if(!dfn[i])tarjan(i);
	int anscnt=0;
	for(int i=1;i<=m;i++)
		if(edge[e[i]]&&c[ver[e[i]]]!=c[ver[e[i]^1]])anscnt++,ans[anscnt].x=min(ver[e[i]],ver[e[i]^1]-n),ans[anscnt].y=(ver[e[i]],ver[e[i]^1]-n);
	sort(ans+1,ans+anscnt+1);
	printf("%d\n",anscnt);
	for(int i=1;i<=anscnt;i++)
		printf("%d %d\n",ans[i].x,ans[i].y);
	return 0;
}
2021/5/26 21:50
加载中...