图论之二分图-HihoCoder1121

题目链接:https://hihocoder.com/problemset/problem/1121

二分图的相关概念:https://blog.csdn.net/qq_36345036/article/details/76977294

代码实现:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int maxn=10005;
vector<int>G[maxn];//用G[maxn]来存图
int vis[maxn];
int N,M;
bool solve()
{
    int flag=0;
    memset(vis,-1,sizeof(vis));
    queue<int>que;
    for(int i=1;i<=N;i++){
        if(vis[i]!=-1)//如果此点已经染过色了,则跳过
            continue;
        que.push(i);//找到没被染色的点,入栈
        while(!que.empty()){
            int top=que.front();
            que.pop();
            for(int j=0;j<G[top].size();j++){
                if(vis[G[top][j]]==-1){//如果与top相邻的点还未被染色,则将它们染成相反的颜色
                    vis[G[top][j]]=!vis[top];
                    que.push(G[top][j]);//再次入栈
                }
                else if(vis[G[top][j]]==vis[top]){//如果与top相邻的点已经被染色,并且与top所染颜色相同则不符合条件
                    return false;
                }
            }
        }
    }
    return true;
}
int main()
{
    int T;scanf("%d",&T);
    while(T--){
        scanf("%d%d",&N,&M);
        for(int i=1;i<=N;i++)//由题意知,i从1开始取值
        {
            G[i].clear();
        }
        for(int i=1;i<=M;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            G[u].push_back(v);
            G[v].push_back(u);//虽是无向图,但因其是染色问题,所以要存成有向图便于判断是否有重色。
        }
        if(solve())
            printf("Correct\n");
        else
            printf("Wrong\n");
    }
    return 0;
}

 

posted @ 2018-11-17 21:20  里昂静  阅读(264)  评论(0编辑  收藏  举报