80分求助
查看原帖
80分求助
59285
封禁用户楼主2020/11/24 16:22
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

const int MAXN=1000005;
int vis[MAXN];
int fs[MAXN],nxt[MAXN],to[MAXN];
int cnt;
int n;
int maxn;
int p[MAXN];
int ans;
int tag;
int x1,x2;

void addedge(int uu,int tt)
{
	to[++cnt]=tt;
	nxt[cnt]=fs[uu];
	fs[uu]=cnt;
}

bool dfs(int x)
{
	for(int i=fs[x];i;i=nxt[i])
	{
		int y=to[i];
		if(vis[y]==tag) continue;
		vis[y]=tag;
		if(!p[y])
		{
			p[y]=x;
			return true;
		}
		
		if(dfs(p[y]))
		{
			p[y]=x;
			return true;
		}
		
	}
	
	return false;
}



int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&x1,&x2);
		maxn=max(maxn,max(x1,x2));
		addedge(x1,i);
		addedge(x2,i);
	}
	
	for(int i=1;i<=maxn;i++)
	{
		tag++;
		if(dfs(i))
		{
			ans++;
		}
		else
		{
			printf("%d",ans);
			return 0;
		}
	}
	
	printf("%d",ans);
	return 0;
}


匈牙利+时间戳优化 然而还是过不了最后两个点。。。	
2020/11/24 16:22
加载中...