二分图染色实例

二分图染色实例

二分图染色水题——CF
解决图的问题的时候先考虑的就是建图
一、邻接矩阵
这道题的数据不支持用二维数组建图,但不要为了做题而做题嘛。我特地用邻接矩阵WA一次。
直接上代码:
这里的结果是WA 12。。。。。

#include
using namespace std;
int color[1010];  
int a,b,c,d,e,f;
int map1[1001][1001];   / /用临界矩阵存图
bool DFS(int s)             //DFS搜索节点的染色情况
{
    queueq; 
    q.push(s);
    color[s]=1;          //将每个初始点的color值赋值为1.
    while(!q.empty())
    {
        int t=q.front();
        q.pop();
        for(int i=1; i<=a; i++)
        {
            if(map1[t][i]&&color[i]==-1)
            {
                q.push(i);
                color[i]=1-color[t];    //将节点t的相关联的节点的color值赋值成为0.
            }
            if(map1[t][i]&&color[i]==color[t])
            {
                return 0;   // 如果t节点的相关连的节点的color值与t点的相等,此图就不是二分图.
            }
        }
    }
    return 1;
}
int main()
{
    scanf("%d%d",&a,&b);
    memset(color,-1,sizeof(color));
    for(int i=1; i<=b; i++)
    {
        scanf("%d%d",&c,&d);
        map1[c][d]=map1[d][c]=1;   //双向边
    }
    int flag=0;
    for(int i=1; i<=a; i++)
    {
        if(color[i]==-1&&DFS(i)==0)
        {
            flag=1;
            break;
        }
    }
    if(flag==0)     //如果是二分图,因为我们已经在DFS函数中将各个染色成为0,1的两种颜色,
    					//	所以我们判断点是否属于同一个集合就只要判断color值是不是相等就行了。
    {
        queuel,k;
        int num1,num2;
        num1=num2=0;
        for(int i=1; i<=a; i++)
        {
            if(color[i]==1)  //判断条件
            {
                num1++;
                l.push(i);

            }
            else if(color[i]==0)    //判断条件
            {
                num2++;
                k.push(i);
            }
        }
        printf("%d\n",num1);
        while(!l.empty())
        {
            printf("%d ",l.front());
            l.pop();
        }
        printf("\n%d\n",num2);
        while(!k.empty())
        {
            printf("%d ",k.front());
            k.pop();
        }
    }
    else
        printf("-1\n");
    return 0;
}
 

个人感觉邻接矩阵好理解一点所以强行注释一波。。。

二、邻接表
正好今天刚搞明白vector
直接用vector建立两个点之间的联系
Accepted

和上面的代码好像啊有木有~
其实是懒得注释了 ╮(╯▽╰)╭

#include
using namespace std;
#define maxn 100006
int color[maxn];
vectorq[maxn];
int a,b,c,d,e,f;
bool DFS(int s)
{
    queueque;
    que.push(s);
    color[s]=1;
    while(!que.empty())
    {
        int t=que.front();
        que.pop();
        for(int i=0; il,k;
        int num1,num2;
        num1=num2=0;
        for(int i=1; i<=a; i++)
        {
            if(color[i]==1)
            {
                num1++;
                l.push(i);

            }
            else if(color[i]==0)
            {
                num2++;
                k.push(i);
            }
        }
        printf("%d\n",num1);
        while(!l.empty())
        {
            printf("%d ",l.front());
            l.pop();
        }
        printf("\n%d\n",num2);
        while(!k.empty())
        {
            printf("%d ",k.front());
            k.pop();
        }
    }
    else
        printf("-1\n");
    return 0;
}

你可能感兴趣的:(图论)