zoukankan      html  css  js  c++  java
  • Codeforces Round #360 (Div. 2)C. NP-Hard Problem

    题意:给出一个无向图,问是否可以是二分图,

    思路:染色就行了,二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=1e5+10;
     4 struct node{
     5     int to,next;
     6 }e[N*4];
     7 int head[N],tot;
     8 void init(){
     9     memset(head,-1,sizeof(head));
    10     tot=0;
    11 }
    12 int n,m;
    13 
    14 void add(int u,int v){
    15     e[tot].to=v;e[tot].next=head[u];head[u]=tot++;
    16 }
    17 int color[N],vis[N];
    18 set<int >a[3];
    19 int t=0;
    20 void dfs(int u,int x){
    21     if(color[u]!=-1){
    22         if(color[u]!=x) t=1;return ;
    23     }
    24     color[u]=x;
    25     a[x].insert(u);
    26     for(int i=head[u];i!=-1;i=e[i].next){
    27         dfs(e[i].to,x^1);
    28     }
    29 }
    30 int main(){
    31     scanf("%d%d",&n,&m);
    32     init();
    33     memset(color,-1,sizeof(color));
    34     int x,y;
    35     for(int i=1;i<=m;i++){
    36         scanf("%d%d",&x,&y);
    37         add(x,y);add(y,x);
    38     }
    39         for(int i=1;i<=n;i++){
    40             if(color[i]==-1) dfs(i,1);
    41         }
    42         if(t) {cout<<-1<<endl;return 0;}
    43         cout<<a[1].size()<<endl;
    44         for(set<int >::iterator it=a[1].begin();it!=a[1].end();it++){
    45             printf("%d ",*it);
    46         }
    47         printf("
    ");
    48         cout<<a[0].size()<<endl;
    49         for(set<int >::iterator it=a[0].begin();it!=a[0].end();it++){
    50             printf("%d ",*it);
    51         }
    52         printf("
    ");
    53 
    54 }
  • 相关阅读:
    SpringBoot启动类踩坑
    数组作业
    多态的使用
    intellij idea怎么设置软件启动时选择项目进入
    方法的递归调用
    取一个数字数字后4位的和
    day09作业
    java 随机数
    java 方法
    java 循环作业
  • 原文地址:https://www.cnblogs.com/hhxj/p/7102637.html
Copyright © 2011-2022 走看看