ural 1106,二分图染色,DFS

时间:2021-10-16 05:30:38

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1106

乍一眼看上去,好像二分图匹配,哎,想不出和哪一种匹配类似,到网上查了一下,DFS染色一遍就可以啦。

两种颜色的很好写。直接没有访问的是1,然后扫邻接表,为2,DFS邻接表。

#include <bits/stdc++.h>
using namespace std; #define maxn 105 vector<int> G[maxn];
int color[maxn],vis[maxn]; void dfs(int u)
{
vis[u] = ;
for(int i=;i<G[u].size();i++)
{
int v = G[u][i];
if(!vis[v])
{
color[v] = - color[u];
dfs(v);
}
}
} int main()
{
int n,t;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
while(scanf("%d",&t),t)
G[i].push_back(t);
} memset(vis,,sizeof(vis));
memset(color,,sizeof(color)); for(int i=;i<=n;i++)
{
if(vis[i]==false)
{
color[i] = ;
dfs(i);
}
} int sum = ;
for(int i=;i<=n;i++)
if(color[i]==)
sum++;
printf("%d\n",sum);
for(int i=;i<=n;i++)
if(color[i]==)
printf("%d ",i);
return ;
}