• 【BZOJ5335】[TJOI2018]智力竞赛(二分图匹配)


    【BZOJ5335】[TJOI2018]智力竞赛(二分图匹配)

    题面

    BZOJ
    洛谷

    题解

    假装图不是一个DAG想了半天,。发现并不会做。
    于是假装图是一个DAG。
    那么显然就是二分答案,然后求一个最小链覆盖就好了。。。
    然而一开始我以为是不交的链覆盖。。。。
    然而是可以交的。。。
    所以就Floyd求一下连通性再二分图匹配就好了。。。
    读不懂题.jpg

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define MAX 505
    inline int read()
    {
    	int x=0;bool t=false;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=true,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return t?-x:x;
    }
    int n,m,v[MAX],mx;
    int g[MAX][MAX];
    int vis[MAX],tim;
    int match[MAX],S[MAX],top;
    bool dfs(int x)
    {
    	for(int i=1;i<=top;++i)
    		if(vis[i]!=tim&&g[S[x]][S[i]])
    		{
    			vis[i]=tim;
    			if(!match[i]||dfs(match[i]))
    			{
    				match[i]=x;
    				return true;
    			}
    		}
    	return false;
    }
    int check(int mid)
    {
    	top=0;for(int i=1;i<=m;++i)if(v[i]<mid)S[++top]=i;
    	int ret=top;++tim;
    	for(int i=1;i<=top;++i)match[i]=0;
    	for(int i=1;i<=top;++i,++tim)ret-=dfs(i);	   
    	return ret;
    }
    int main()
    {
    	n=read()+1;m=read();
    	for(int i=1;i<=m;++i)
    	{
    		mx=max(mx,v[i]=read());
    		int K=read();while(K--)g[i][read()]=1;
    	}
    	for(int k=1;k<=n;++k)
    		for(int i=1;i<=n;++i)
    			for(int j=1;j<=n;++j)
    				g[i][j]|=g[i][k]&g[k][j];
    	int l=1,r=mx;
    	while(l<=r)
    	{
    		int mid=(l+r)>>1;
    		if(check(mid)<=n)l=mid+1;
    		else r=mid-1;
    	}
    	if(l<=mx)printf("%d
    ",l-1);
    	else puts("AK");
    	return 0;
    }
    
  • 相关阅读:
    06.04 html
    汉企第一天
    Django之ajax
    Diango之图书管理系统编辑
    Django之模型层&ORM操作
    Django 之模板层
    Django之 路由层
    Django之ORM简单操作(一)
    迭代器、可迭代对象、迭代器对象、生成器、生成器对象、枚举对象
    装饰器
  • 原文地址:https://www.cnblogs.com/cjyyb/p/10448381.html
Copyright © 2020-2023  润新知