Pagini recente » Cod sursa (job #99328) | Cod sursa (job #2413933) | Cod sursa (job #2112007) | Cod sursa (job #2789575) | Cod sursa (job #1568256)
#include <bits/stdc++.h>
#define NR 8195
using namespace std;
pair<int, int> M[20005];
int ind[NR][NR];
vector<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];
if(!viz[cur] && dfs(ind[st][cur])) {
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];
if(!viz[cur] && dfs(ind[nd][cur])) {
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;
ind[M[i].first][M[i].second] = i;
V[M[i].first].push_back(M[i].second);
}
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;
}