求助,一直RE该怎么改?样例已过
查看原帖
求助,一直RE该怎么改?样例已过
218999
啷里个浪楼主2021/6/1 14:37
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<vector>
using namespace std;
int r,c,n,cnt,head[4010],lr[4010],lc[4010],link[4010],vis[4010],f[4010];
struct node{
	int to,next;
}a[4000010];
 int read(){
	int s=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s;
}
void add(int u,int v){
	++cnt;
	a[cnt].to =v;
	a[cnt].next =head[u];
	head[u]=cnt;
}
int dfs(int x){
	for(int i=head[x];i;i=a[i].next ){
		int v=a[i].to ;
		if(vis[v])continue;
		vis[v]=1;
		if(!link[v]||dfs(link[v])){
			link[v]=x;
			f[x]=1;
			return 1;
		}
	}
	return 0;
}
int js(){
	int ans=0;
	memset(link,0,sizeof(link));
	for(int i=1;i<=n;i++){
		memset(vis,0,sizeof(vis));
		if(dfs(i)){
			++ans;
			//f[i]=1;
		}
	}
	return ans;
}
void find(int x){
	lr[x]=1;
	for(int i=head[x];i;i=a[i].next ){
		int v=a[i].to ;
		if(link[v]&&!lr[link[v]]&&!lc[v]){
			lc[v]=1;
			find(link[v]);
		}
	}
}
void fin(){
	memset(lr,0,sizeof(lr));
	memset(lc,0,sizeof(lc));
	for(int i=1;i<=r;i++)if(!f[i])find(i);
	for(int i=1;i<=r;i++)if(!lr[i])cout<<"r"<<i<<" ";
	cout<<endl;
	for(int i=1;i<=c;i++)if(lc[i])cout<<"c"<<i<<" ";
	cout<<endl;
}
int main(){
	while(true){
		r=read();c=read();n=read();
		if(r==0&&c==0&&n==0)break;
		memset(head,0,sizeof(head));
		memset(f,0,sizeof(f));
		for(int i=1;i<=n;i++){
			int u,v;
			u=read();v=read();
			add(u,v);
		}
		cout<<js()<<endl;
		fin();
	}
	return 0;
}
2021/6/1 14:37
加载中...