社区讨论

为啥用染色体判断二分图后 用匈牙利算法求最大匹配数不对呢只有六十分

P1330封锁阳光大学参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@lxby6rwg
此快照首次捕获于
2024/06/12 22:50
2 年前
此快照最后确认于
2024/06/13 17:06
2 年前
查看原帖
CPP
#include <iostream>
#include <cstring>

using namespace std;
const int N=1e4+5,M=2e5+5;

int head[N],idx;
bool st[N];
int match[N];
int color[N]; 

struct node
{
	int to,next;
}e[M];

int n,m;

void add(int x,int y)
{
	e[++idx].to=y;
	e[idx].next=head[x];
	head[x]=idx;
}

bool dfs(int x,int c)
{
	color[x]=c;
	for(int i=head[x];i;i=e[i].next)
	{
		int v=e[i].to;
		if(!color[v])
		{
			if(!dfs(v,3-c))return false;
		}
		else if(color[v]==c)return false;
	}
	return true;
}

bool find(int x)
{
    for(int i=head[x];i;i=e[i].next)
    {
        int v=e[i].to;
        if(!st[v])
        {
            st[v]=true;
            if(match[v]==0||find(match[v]))
            {
                match[v]=x;
                return true;
            }
            
        }
    }
    return false;
}

int main()
{
	cin>>n>>m;
	while(m--)
	{
		int a,b;
		cin>>a>>b;
		add(a,b);
		add(b,a);
	}
	bool flag=false;
	
	for(int i=1;i<=n;i++)
	{
		if(!color[i])
		{
			if(!dfs(i,1))
			{
				flag=true;
				break;
			}
		}
	}
	if(flag)
	{
		cout<<"Impossible"<<endl;
		return 0;
	}
	int res=0;
	for(int i=1;i<=n;i++)
	{
		if(color[i]==1)continue;
		memset(st,0,sizeof st);
		if(find(i))res++;
	}
	
	cout<<res<<endl;
	for(int i=1;i<=n;i++)
		cout<<i<<' '<<match[i]<<endl;
	return  0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...