样例过了,0分
查看原帖
样例过了,0分
513326
阿哲朗读楼主2022/2/15 11:35
#include<bits/stdc++.h>
using namespace std;
int l,r,n,m[2020],used[2020],cnt,p,head[4040];
struct node
{
	int to,next;
}a[8080];
void AddEdge(int h,int t)
{
	a[++p].to=t;
	a[p].next=head[h];
	head[h]=p;
}
 bool find(int j)
 {
	for(int i=head[j];i;i=a[i].next)	//枚举右图节点 
	{
		int k=a[i].to;
		if(!used[k])	//有边 且 没有遍历过 
		{
			used[k]=1;		//遍历 
			if(!m[k]||find(m[k]))	//i没有匹配 或  i的匹配有匹配 
			{
				m[k]=j;		//i的匹配为 i →j 
				return true;	//找到匹配 
			}
		}
	}
	return false;	//未找到匹配 
 }
 void Maxmatch()
 {
	for(int i=1;i<=r;i++)	//枚举左图节点 
	{
		memset(used,0,sizeof(used));
		if(find(i)) cnt++;		//找到更大匹配,边+1 
	}
 }
 int main()
 {
	cin>>l>>r;
	for(int i=1;i<=r;i++)
	{
		int o,t;
		cin>>o>>t;
		AddEdge(i,o);
		AddEdge(i,t);
	}
	Maxmatch();		//求最大匹配 
	cout<<cnt<<endl;
	for(int i=0;i<=l-1;i++)
	{
		if(m[i]) cout<<i<<endl;
	}
	return 0;
 }
2022/2/15 11:35
加载中...