Cod sursa(job #1568257)

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