題意:
  給你一個無向圖,判斷是否能夠構成一個二分圖,如果能的話,輸出二分圖左邊的集合和右邊的集合

分析:
    先給每一個頂點的color初始化-1,表示沒有被染色,用vector陣列v[a],表示元素a所相連的全部元素,然後列舉每一個頂點,發現沒有被染色,就對它進行染色,先把頂點染成0,然後

再將染成顏色為0的vector加入當前元素,在列舉與這個元素相連的元素,假設顏色是c的話,相連的就染成c^1,它會把0變成1,1變成0;如果二分圖左邊是0,右邊是1,則表示它已被染色直

接return,發現染色的顏色與該染的顏色不符合,就不能構成二分圖了,ok=false.

程式碼如下:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector> using namespace std; const int maxn = + ;
vector<int>g[maxn],v[];
bool ok = true;
int color[maxn]; void dfs(int k,int c)
{
if(!ok) //該頂點已被染色
return ;
if (color[k] != -)
{
if (color[k] != c) //發現染色的顏色與該染的顏色不符合,就不能構成二分圖了,ok=false
ok = false;
return;
}
color[k] = c;
v[c].push_back(k); //將已被染色的元素加入陣列v中
int len = g[k].size();
for (int i = ; i < len; i++) //列舉與這個元素相連的元素
dfs(g[k][i],c^); // 0 -> 1,, 1 -> 0;
} void print(vector<int> & t)
{
int len = t.size();
printf("%d\n",len);
for (int i = ; i < len; ++i)
{
if(i)
printf(" ");
printf("%d", t[i]);
}
printf("\n");
} int main()
{
int n, m;
while(scanf("%d%d", &n,&m)==)
{
for(int i = ; i < m; i++)
{
int u,w;
scanf("%d%d", &u, &w);
g[u].push_back(w);
g[w].push_back(u);
}
memset(color, -, sizeof(color)); //初始化-1表示沒被染色
for(int i = ; i <= n; i++)
{
if (color[i] == -) //對所有未染色的頂點染色
dfs(i,);
}
if(!ok)
printf("-1\n");
else
for(int i = ; i < ; i++)
print(v[i]);
}
return ;
}