黑白染色

BFS

点的数量,边的数量,以及边的连接情况(邻接矩阵),用黑白两种颜色给点染色,要求相连的两个点不能同颜色,如果能成功染色,输出被染成白色的点

#include<stdio.h>
#define SIZE 100

int map[SIZE][SIZE];
int queue[SIZE * SIZE];
int color[SIZE];
int visit[SIZE];

int ncases;
int n,m;
int ans;

int head = 0;
int rear = 0;
int tab;
void bfs(int step)
{
    queue[rear] = step;
    rear++;
    color[step]=1;
    visit[step]=1;
    while(head < rear)
    {
        int temp = queue[head];
        head++;
        for(int i=1;i<=n;i++)
        {
            tab=0;
            if(map[temp][i] == 1)
            {
                if(color[i] == 0)
                {
                    color[i] -= color[temp];
                    queue[rear]=i;
                    rear++;
                    visit[i]=1;
                }
                else if(color[i] == color[temp])
                {
                    tab=1;
                    ans=-1;
                    break;
                }
            }
        }
        if(tab) break;
    }
}
int main(){
    freopen("input.txt","r",stdin);
    scanf("%d",&ncases);
    for(int i=0;i<ncases;i++)
    {
        scanf("%d%d",&n,&m);
        ans=0;
        int x,y;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            map[x][y]=1;
            map[y][x]=1;
        }
        for(int i=1;i<=n;i++)
        {
            if(visit[i] == 0)
                bfs(i);
            if(tab) break;
        }
        if(ans==0)
        {
            for(int i=1;i<=n;i++)
            {
                if(color[i] == -1)
                    ans++;
            }
            printf("%d\n",ans);
            for(int i=1;i<=n;i++)
            {
                if(color[i] == -1)
                    printf("%d ",i);
            }
            printf("\n");
        }
        else printf("%d\n",ans);
    }
}
/*测试用例
9
5 5
1 2 2 3 3 4 4 5 5 1
6 6
1 2 2 3 3 4 4 5 5 6 6 1
4 5
1 2 2 3 3 4 4 1 4 2
4 6
1 2 2 3 3 4 4 1 4 2 1 3
4 4
1 2 2 3 3 4 4 1
5 6
1 2 1 4 2 3 2 5 3 4 5 4
12 13
1 2 1 4 2 3 3 4 4 5 5 6 6 7 7 8 8 5 5 9 4 10 9 10 11 12
5 4
1 4 1 3 3 5 2 5
7 5
1 4 1 3 3 5 2 5 6 7
测试结果
-1
3
2 4 6
-1
-1
2
2 4
2
2 4
6
2 4 6 8 9 12
3
2 3 4
4
2 3 4 7 */
时间: 2024-10-22 06:08:53

黑白染色的相关文章

POJ 1466 Girls and Boys 黑白染色 + 二分匹配 (最大独立集) 好题

有n个人, 其中有男生和女生,接着有n行,分别给出了每一个人暗恋的对象(不止暗恋一个) 现在要从这n个人中找出一个最大集合,满足这个集合中的任意2个人,都没有暗恋这种关系. 输出集合的元素个数. 刚开始想,把人看成顶点,若有暗恋的关系,就连一条边,构成一个图 独立集的概念:一个图中两两互不相连的顶点集合 所以这道题,就是要求最大独立集 有:最大独立集+最小顶点覆盖=|V|(顶点的总个数) 那就求最小顶点覆盖了 根据题意: 暗恋的对象性别不同,所以a暗恋b,b暗恋c,c暗恋a这种关系不可能存在 也

hdu1507Uncle Tom&#39;s Inherited Land*(最大匹配,黑白染色)

Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1943 Accepted Submission(s): 809 Special Judge Problem Description Your old uncle Tom inherited a piece of land from his

hdu 5285 二分图黑白染色

题意:给出 n 个人,以及 m 对互不认识的关系,剩余的人都互相认识,要将所有人分成两组,组内不能有互不认识的人,要求每组至少有一人,并且第一组人数尽量多,问两组人数或不可能时单独输出 BC 48 场的B题,这两天黑白染色做的不少,要把互不认识的人分在不同的组里,其实就是看整个图是否能够形成二分图,如果不能形成二分图的话,那么说明图中一定存在奇环,那么人就不能分在两个组中而保证组内都认识.所以就是判二分图,用黑白染色,然后将染色后数量多的点分在第一组,剩余分在第二组.但是题中有坑点,首先,人数小

P1418 选点问题(黑白染色)

P1418 选点问题 题目描述 给出n个点,m条边,每个点能控制与其相连的所有的边,要求选出一些点,使得这些点能控制所有的边,并且点数最少.同时,任意一条边不能被两个点控制 输入输出格式 输入格式: 第一行给出两个正整数n,m 第2~m+1行,描述m条无向边 每行给出x,y,表示一条无向边(x,y) 输出格式: 输出最少需要选择的点的个数,如果无解输出“Impossible”(不带引号) 输入输出样例 输入样例#1: 7 5 1 2 1 3 5 6 6 7 1 2 输出样例#1: 2 说明 [数

二分图判定--黑白染色

首先,二分图又叫二部图,特点是所有点分成两半,每一半内的点之间没有边相连,只有两半之间会有边相连,图内无奇环,当然,单点图或者有单点的图也属于二分图,因此最主要的区分就是图内无奇环了.对于一个图,是否是二分图,常用的方法是黑白染色,由于给定图常常不完全连通,所以只要对于每一个还未标记过的点,从它开始DFS按照黑白相间的方法标记颜色(0/1),每次DFS操作就是将这一连通块内按黑白分成两半,若途中遇到需要然成某种颜色但已经标记为另一种颜色时,则表明出现了奇环,不能构成二分图.而要注意,每次DFS只

HDU 1565 (最大流+黑白染色化二分图求最小割)

http://acm.hdu.edu.cn/showproblem.php?pid=1565 思路:将横纵坐标和为偶尔染白色,其他染黑色,黑点连接源点,流量为该点的值,白点连接汇点,流量为该点的值,黑白点有相邻的就连边,值为无穷大.最后求最大流,即该图的最小割. PS:刚开始不明白为为什么最大流会等于最小割,为什么所有的点之和减去最小割就会等于答案. 我的理解是:整张图其实就跟连接管道一样,连接了黑点表示取了黑点那个值的流量,白点也是,而连接了相邻的黑白点求出的最大流就会是流量较小的那个的值.好

HDU1507 Uncle Tom&#39;s Inherited Land* 二分图匹配 匈牙利算法 黑白染色

原文链接http://www.cnblogs.com/zhouzhendong/p/8254062.html 题目传送门 - HDU1507 题意概括 有一个n*m的棋盘,有些点是废的. 现在让你用1*2的矩形覆盖所有的不废的点,并且不重叠,问最多可以覆盖多少个1*2的矩形,输出方案,有SPJ. 输入描述: 多组数据,每组首先两个数n,m(如果n和m为0,则结束程序) 然后给出k 然后给出k个二元组(x,y)表示废点的坐标. 题解 按照前两片博文的算法已经不行了,因为方案不对了. 所以我们要进行

bzoj4808: 马 &amp; bzoj3175: [Tjoi2013]攻击装置 (黑白染色+最小割)

bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 题目:传送门 简要题意: 和n皇后问题差不多,但是这里是每个棋子走日子,而且有些格子不能放棋子.求最多能放多少个棋子. 题解: 双倍经验好评 之前看过机房神犇做...有点印象是最小割. 但是直接割的话不会...要应用到黑白染色: 最开始我想递归染色,也就是取一个开始染,然后递归下去... 波老师说会错ORZ...因为感觉递归的情况不好掌握,有可能会重复染色... 结果有一个肥肠巧妙的方法...直接相邻的染为不同颜色 之

黑白染色——封锁阳光大学

所谓黑白染色,就是指用bfs或dfs依次遍历每一个点,同时进行染色,一黑一白,如果遇到已经染过色的点并且点的颜色和即将要染的颜色冲突,就说明无法进行二分,无法满足染色.大概就是这样的. 下面我们看一道例题: P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接.每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个

[cf557d]Vitaly and Cycle(黑白染色求奇环)

题目大意:给出一个 n 点 m 边的图,问最少加多少边使其能够存在奇环,加最少边的情况数有多少种. 解题关键:黑白染色求奇环,利用数量分析求解. 奇环:含有奇数个点的环. 二分图不存在奇环.反之亦成立. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using nam