
/*题意:把一个图中的点分为两组,保证每个组的任意节点在另外一组一定有一个与之相邻的节点。
* 解法:bfs一遍黑白染色。图可能不联通。只有一个节点的则不能成功分组。
*/
#include <functional>
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <math.h>
#include <ctime>
#include <list>
#include <set>
#include <map>
#include<time.h>
using namespace std;
#define LL long long
#define vN 105
int adj[vN][vN];
int used[vN],n;
int color[vN];
int bfs(int x)
{
int cnt=0;
queue<int> q;
q.push(x);
used[x]=1;
color[x]=0;
while(!q.empty())
{
int u=q.front()
;
q.pop();
cnt++;
for(int i=1;i<=n;i++)
{
if(!used[i]&&adj[u][i])
{
q.push(i);
color[i]=1-color[u];
used[i]=1;
}
}
}
return cnt;
}
int main()
{
//freopen("data.in","r",stdin);
memset(used,0,sizeof(used));
memset(adj,0,sizeof(adj));
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
while(cin>>x&&x)
{
adj[i][x]=1;
adj[x][i]=1;
}
}
int ans=-1;
for(int i=1;i<=n;i++)
{
if(!used[i])
{
int flag=bfs(i);
if(flag==1)
{
ans=0;
}
}
}
if(ans==0)cout<<ans<<endl;
else
{
int cnt=0;
for(int i=1;i<=n;i++)
{
if(color[i])cnt++;
}
cout<<cnt<<endl;
for(int i=1;i<=n;i++)
{
if(color[i])
{
cout<<i<<" ";
}
}
cout<<endl;
}
}
近期评论