首页 > 其他 > 详细

二分图染色

时间:2019-08-05 19:20:09      阅读:97      评论:0      收藏:0      [点我收藏+]

二分图染色实例及问题分析

[二分图染色水题——CF](http://codeforces.com/contest/687/problem/A)

 


解决图的问题的时候先考虑的就是建图

一、邻接矩阵
这道题的数据不支持用二维数组建图,但不要为了做题而做题嘛。我特地用邻接矩阵WA一次。
直接上代码,题目解释直接在代码里实现了:
这里的结果是WA 12。。。。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int color[1010];  
 4 int a,b,c,d,e,f;
 5 int map1[1001][1001];     //用临界矩阵存图
 6 bool DFS(int s)             //DFS搜索节点的染色情况
 7 {
 8     queue<int>q; 
 9     q.push(s);
10     color[s]=1;          //将每个初始点的color值赋值为1.
11     while(!q.empty())
12     {
13         int t=q.front();
14         q.pop();
15         for(int i=1; i<=a; i++)
16         {
17             if(map1[t][i]&&color[i]==-1)
18             {
19                 q.push(i);
20                 color[i]=1-color[t];    //将节点t的相关联的节点的color值赋值成为0.
21             }
22             if(map1[t][i]&&color[i]==color[t])
23             {
24                 return 0;   // 如果t节点的相关连的节点的color值与t点的相等,此图就不是二分图.
25             }
26         }
27     }
28     return 1;
29 }
30 int main()
31 {
32     scanf("%d%d",&a,&b);
33     memset(color,-1,sizeof(color));
34     for(int i=1; i<=b; i++)
35     {
36         scanf("%d%d",&c,&d);
37         map1[c][d]=map1[d][c]=1;   //双向边
38     }
39     int flag=0;
40     for(int i=1; i<=a; i++)
41     {
42         if(color[i]==-1&&DFS(i)==0)
43         {
44             flag=1;
45             break;
46         }
47     }
48     if(flag==0)     //如果是二分图,因为我们已经在DFS函数中将各个染色成为0,1的两种颜色,
49                         //    所以我们判断点是否属于同一个集合就只要判断color值是不是相等就行了。
50     {
51         queue<int>l,k;
52         int num1,num2;
53         num1=num2=0;
54         for(int i=1; i<=a; i++)
55         {
56             if(color[i]==1)  //判断条件
57             {
58                 num1++;
59                 l.push(i);
60 
61             }
62             else if(color[i]==0)    //判断条件
63             {
64                 num2++;
65                 k.push(i);
66             }
67         }
68         printf("%d\n",num1);
69         while(!l.empty())
70         {
71             printf("%d ",l.front());
72             l.pop();
73         }
74         printf("\n%d\n",num2);
75         while(!k.empty())
76         {
77             printf("%d ",k.front());
78             k.pop();
79         }
80     }
81     else
82         printf("-1\n");
83     return 0;
84 }
85  

 

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

二、邻接表
正好今天刚搞明白vector
直接用vector建立两个点之间的联系(直接用图的方法用链表存也是可以的)

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

#include<bits/stdc++.h>
using namespace std;
#define maxn 100006
int color[maxn];
vector<int>q[maxn];
int a,b,c,d,e,f;
bool DFS(int s)
{
    queue<int>que;
    que.push(s);
    color[s]=1;
    while(!que.empty())
    {
        int t=que.front();
        que.pop();
        for(int i=0; i<q[t].size(); i++)
        {
            int x=q[t][i];
            if(color[x]==-1)
            {
                color[x]=1-color[t];
                que.push(x);
            }
            if(color[x]==color[t])
            {
                return 0;
            }
        }
    }
    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);
        q[c].push_back(d);
        q[d].push_back(c);
    }
    int flag=0;
    for(int i=1; i<=a; i++)
    {
        if(color[i]==-1&&DFS(i)==0)
        {
            flag=1;
            break;
        }
    }
    if(flag==0)
    {
        queue<int>l,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;
}

 

二分图染色

原文:https://www.cnblogs.com/v1dv1dv1d/p/11304954.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!