传送门:http://codeforces.com/problemset/problem/272/E
题意:给你n匹马,m种关系。马之间可以有敌对关系。要你把马分在两个集合里,每个集合每匹马,不能有两个敌对马,题目数据保证每匹马最多有三个敌对关系。
属于第一集合输出0,第二集合输出1,否则输出-1(这种情况不存在的)。
分析:匹配,首先认为全部马在0集合里面,然后选敌对关系大于2的马,压入队列,对队列每匹马,进行统计放在哪个集合使得满足条件,直到队列为空结束。
Input
3 3
1 2
3 2
3 1
Output
100
#include <bits/stdc++.h>
using namespace std;
int n,m;
vector<int> v_ans,v_tmp;
vector<bool> vis;
vector<vector<int> > v_list;
bool input()
{
cin >> n >> m;
if(cin.eof())
return false;
v_ans.clear();v_ans.resize(n+1);
vis.clear();vis.resize(n+1);
v_tmp.clear();v_tmp.resize(n+1);
v_list.clear();v_list.resize(n+1);
int x,y;
for(int i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
++v_tmp[x];++v_tmp[y];
v_list[x].push_back(y);
v_list[y].push_back(x);
//printf("%d %d\n",x,y);
}
return true;
}
void print()
{
for(int i = 1; i <= n; ++i)
printf("%d", v_ans[i]);
puts("");
}
void solve()
{
//print();
//printf("solve ....\n");
queue<int> Q;
for(int i=1;i<=n;i++)
{
if(v_tmp[i]>1)
Q.push(i),vis[i] = true;
}
while(!Q.empty())
{
int u = Q.front();
Q.pop();
vis[u] = false;
if(v_tmp[u]<2)continue;
// printf("u == %d\n",u);
v_ans[u] ^=1;
int k =0;
for(int i=0;i<v_list[u].size();i++)
{
int v = v_list[u][i];
if(v_ans[u]==v_ans[v])
++v_tmp[v],k++;
else
--v_tmp[v];
if(!vis[v]&&v_tmp[v]>1)
Q.push(v),vis[v] = true;
}
v_tmp[u] = k;
if(k>1)
Q.push(u),vis[u]=true;
}
}
int main()
{
while(input())
{
solve();
print();
}
return 0;
}