Pagini recente » Cod sursa (job #1346024) | Cod sursa (job #395060) | Cod sursa (job #2350690) | Cod sursa (job #2601026) | Cod sursa (job #1568257)
#include <bits/stdc++.h>
#define NR 8195
using namespace std;
pair<int, int> M[20005];
vector< pair<int, int> > V[NR];
bool p[NR];
bool q[NR];
bool viz[NR];
bool dfs(int edge) {
int st = M[edge].first;
int nd = M[edge].second;
viz[st] = viz[nd] = true;
if(!q[st]) {
p[st] = true;
return true;
}
if(!p[nd]) {
q[nd] = true;
return true;
}
if(q[st])
for(int i = 0; i < V[st].size(); i ++) {
int cur = V[st][i].first;
int ind = V[st][i].second;
if(!viz[cur] && dfs(ind)) {
p[st] = true;
q[st] = false;
return true;
}
}
if(p[nd])
for(int i = 0; i < V[nd].size(); i ++) {
int cur = V[nd][i].first;
int ind = V[nd][i].second;
if(!viz[cur] && dfs(ind)) {
q[nd] = true;
p[nd] = false;
return true;
}
}
return false;
}
int main()
{
ifstream d("felinare.in");
ofstream g("felinare.out");
int n, m; d >> n >> m;
for(int i = 1; i <= m; i ++) {
d >> M[i].first >> M[i].second;
V[M[i].first].push_back(make_pair(M[i].second, i));
}
bool ok = true;
while(ok) {
ok = false; memset(viz, false, sizeof(viz));
for(int i = 1; i <= m; i ++) if(!p[ M[i].first ] && !q[ M[i].second ]) ok |= dfs(i);
}
int k = n << 1;
for(int i = 1; i <= n; i ++) {
if(p[i]) k --;
if(q[i]) k --;
}
g << k << "\n";
for(int i = 1; i <= n; i ++) {
if(p[i] && q[i]) g << "0\n";
else if(!p[i] && q[i]) g << "1\n";
else if(p[i] && !q[i]) g << "2\n";
else if(!p[i] && !q[i]) g << "3\n";
}
return 0;
}