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("\n"); 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("\n"); 53 54 }