Cod sursa(job #2053917)

Utilizator livliviLivia Magureanu livlivi Data 1 noiembrie 2017 15:18:24
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<fstream>
#include<vector>
#include<bitset>
#define N 255
using namespace std;

vector<int> vecin[N+1];
bitset<N+1> viz;
int _left[N+1];
int _right[N+1];

ifstream cin("strazi.in");
ofstream cout("strazi.out");

bool pairUp(int nod){
    if (viz[nod]==true) return false;
    viz.set(nod);

    for(int i=0;i<vecin[nod].size();i++){
        int now=vecin[nod][i];

        if (_left[now]==0 ||pairUp(_left[now])){
            _left[now]=nod;
            _right[nod]=now;
            return true;
        }
    }

    return false;
}

int main(){
    int n,m,i;

    cin>>n>>m;
    for(i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;

        vecin[x].push_back(y);
    }

    bool fl=true;
    int cnt=0;
    while(fl){
        fl=false;
        viz.reset();

        for(i=1;i<=n;i++)
            if (_right[i]==0 &&pairUp(i)){
                fl=true;
                cnt++;
            }
    }

    cout<<n-cnt-1<<endl;

    int start=0;
    for(i=1;i<=n;i++)
        if (_left[i]==0){
            if (start!=0){
                int nod=i;
                while(_right[nod]!=0) nod=_right[nod];

                _right[nod]=start;
                _left[start]=nod;

                cout<<nod<<' '<<start<<endl;
            }
            start=i;
        }

    while(start!=0){
        cout<<start<<' ';
        start=_right[start];
    }

    return 0;
}