Cod sursa(job #1855146)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 23 ianuarie 2017 14:33:38
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <bitset>
#define MAXN 270

using namespace std;

int n, m, st[MAXN], dr[MAXN];
vector<int> graf[MAXN], rez;
vector<pair<int, int> > mu;
bitset<MAXN> viz;

int trial(int nod)
{
    if (viz[nod])
        return 0;
    viz[nod] = 1;
    for (int y : graf[nod])
        if (dr[y] == 0 || trial(dr[y])) {
            st[nod] = y;
            dr[y] = nod;
            return 1;
        }
    return 0;
}

int main()
{
    freopen("strazi.in", "r", stdin);
    freopen("strazi.out", "w", stdout);

    scanf("%d %d", &n, &m);
    for (int i = 1; i <= m; i++) {
        int x, y;
        scanf("%d %d", &x, &y);
        graf[x].push_back(y);
    }
    for (int ok = 1; ok; ) {
        ok = 0, viz = 0;
        for (int i = 1; i <= n; i++)
            if (st[i] == 0)
                ok |= trial(i);
    }
    int cap = 0;
    for (int i = 1; i <= n; i++) {
        if (dr[i] == 0) {
            mu.push_back(make_pair(cap, i));
            rez.push_back(i);
            for (cap = i; st[cap] != 0; cap = st[cap])
                rez.push_back(st[cap]);
        }
    }
    printf("%d\n", mu.size()-1);
    for (int i = 1; i < mu.size(); i++)
        printf("%d %d\n", mu[i].first, mu[i].second);
    for (int v : rez)
        printf("%d ", v);



    return 0;
}