首页 > 其他分享 >二分图

二分图

时间:2023-04-28 16:44:40浏览次数:21  
标签:二分 return int ne color bool 集合

\[二分图 \begin{cases} \ 染色法 \\[4ex] 匈牙利算法 \end{cases}\ \]



染色法

//染色法判别二分图模板

int n;		//n表示点数
int h[N],e[M],ne[M],idx;	//邻接表存储图
int color[N];		//表示每个点的颜色,-1表示为染色,0表示白色,1表示黑色

//参数:u表示当前节点,c表示当前点的颜色
bool dfs(int u  int c)
{
    color[u]=c;
    for(int i=h[u];i!=-1;i=ne[i])
    {
        int j=e[i];
        if(color[j]==-1)
        {
            if(!dfs(j,!c))return false;
        }
        else if(color[j]==c)return false;
    }
    return true;
}

bool check()
{
    memset(color,-1,sizeof color);
    bool flag=true;
    for(int i=1;i<=n;i++)
        if(color[i]==-1)
            if(!dfs(i,0))
            {
                flag=false;
                break;
            }
    return flag;
}



匈牙利算法

//匈牙利算法模板

int n1,n2;		//n1表示第一个集合中的点数,n2表示第二个集合中的点数
int h[N],e[M],ne[M],idx;	//匈牙利算法中只会用到从第一个集合指向第二个集合的边
int match[N];		//存储第二个集合中的每个点当前匹配的第一个集合中的点是哪个
bool st[N];			//表示第二个集合中的每个点是否已经被遍历过

bool find(int x)
{
    for(int i=h[x];i!=-1;i=ne[i])
    {
        int j=e[i];
        if(!st[j])
        {
            st[j]=true;
            if(match[j]==0||find(match[j]))
            {
                match[j]=x;
                return true;
            }
        }
    }
    
    return false;
}

//求最大匹配数,依次枚举第一个集合中的每个点能否匹配第二个集合中的点
int res=0;
for(int i=1;i<=n;i++)
{
    memset(st,false,sizeof st);
    if(find(i))res++;
}


标签:二分,return,int,ne,color,bool,集合
From: https://www.cnblogs.com/evilboy/p/17362589.html

相关文章

  • 二分查找算法讲解及其C++代码实现
    二分查找算法是一种常用的查找算法,也被称为折半查找。它可以在有序的数组或列表中快速查找需要的元素。算法描述:首先确定数组的中间位置mid=(left+right)/2;然后将要查找的值key与中间位置的值进行比较;如果key等于中间位置的值,则查找成功,返回mid;如果key小于中间位置的值,则在......
  • 【二分查找】LeetCode 153. 寻找旋转排序数组中的最小值
    题目链接153.寻找旋转排序数组中的最小值思路首先分析一下旋转数组可能有的状态:左<中<右,此时最小值肯定在左边,应当收缩右边界左<中,中>右,此时最小值肯定在右半段,应当收缩左边界左>中,中<右,此时最小值肯定在左半段,应当收缩右边界分析这三种状态可以发现,中值小......
  • 整体二分学习笔记
    整体二分引入对于一堆询问,如果每个单独的询问都可以二分解决的话,时间复杂度为\(O(NM\logN)\),但实际上每次二分都会有一些残留信息被我们扔掉,如果我们将所有询问一起二分,就可以最大时间的减小复杂度。讲解经典例题:区间第k大给定一个序列a和一个整数S,有2种操作:1.将a......
  • poj 2584 T-Shirt Gumbo 二分匹配
    T-ShirtGumboTimeLimit: 1000MS MemoryLimit: 65536KTotalSubmissions: 2935 Accepted: 1376DescriptionBoudreauxandThibodeauxarestudentvolunteersforthisyear'sACMSouthCentralRegion'sprogrammingcontest.Oneoftheirdutiesis......
  • 整体二分
    二分的进阶版。先看一个经典问题。区间第K大给定一个长度为\(n\)的序列\(a\)和\(m\)个询问.每次询问给定一个区间\([l,r]\),输出该区间第\(k\)大的数。\(n,m\le30000,a_i\in[0,2^{31})\)对于单次询问,二分答案即可。如何处理多组询问呢?不难发现在处理每次询问......
  • 折半查找(二分查找法)
    问题描述:N个有序整数数列已放在一维数组中,利用二分查找法查找整数m在数组中的位置。若找到,则输出其下标值;反之,则输出“Notbefound!”。代码:#include<iostream>#defineN10intmain(){ intk,i0=-1,a[N]={3,12,30,34,45,57,66,78,89,100}; intmid=(N-1)/......
  • 实例解释BCELoss与BCEWithLogitsLoss的关联(二分类问题)
      BCEWithLogitsLoss=Sigmoid+BCELoss,      nn接口                       Function接口nn.BCELoss()                 F.binary_cross_entropy()nn.BCEWithLogitsLos......
  • ZOJ Monthly, August 2014 ZOJ - 3806 计算几何+二分
    Atriangleisonethebasicshapesingeometry.It’sapolygonwiththreeverticesandthreesideswhicharelinesegments.AtrianglewithverticesA,B,CisdenotedΔABC.Anditsthreesides,BC,CA,ABareoftendenoteda,bandc.Theincircleofat......
  • XI Samara Regional Intercollegiate Programming Contest Problem K. Video Reviews
    Thestudio«LodkaGaming»isengagedinadvertisingoftheirnewgame«.C.O.N.T.E.S.T:UnexpectedBehaviour».Thestudio’smarketerisplanningtocommunicatewithnvideobloggersonebyone(inthepredeterminedorder,startingfromthe1-standend......
  • HDU - 5649 线段树+区间二分答案 (好题)
    DZYhasasequencea[1…n].Itisapermutationofintegers1∼n.Nowhewantstoperformtwotypesofoperations:0lr:Sorta[l…r]inincreasingorder.1lr:Sorta[l…r]indecreasingorder.Afterdoingalltheoperations,hewilltellyouapositionk,andask......