ADV-黑白染色

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ADV-黑白染色相关的知识,希望对你有一定的参考价值。

只写了进行一次的代码,和题目的差异就是少了输入可以测试几个样例。

#include<stdio.h>
int queue[1000];
int color[100];
int book[100];
int n,m;
int ans;
int map[100][100];
int tab;
void bfs(int step){
    int head=0,rear=0;
    queue[rear++]=step;
    color[step]=1;
    book[step]=1;
    while(head<rear){
        int temp=queue[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;
                    book[i]=1;
                }
                else if(color[i]==color[temp]){
                    tab=1;
                    ans=-1;
                    break;
                }
            }
        }
        if(tab) break;
    }
}
int main(){
    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(book[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 
 

 

以上是关于ADV-黑白染色的主要内容,如果未能解决你的问题,请参考以下文章

黑白染色

黑白染色

CZY选讲·黑白染色

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

[BZOJ2638] 黑白染色

[模板]黑白染色