Cod sursa(job #1568256)

Utilizator serbanSlincu Serban serban Data 14 ianuarie 2016 00:18:02
Problema Felinare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#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;
}