Cod sursa(job #2077546)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 28 noiembrie 2017 11:02:22
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include<bits/stdc++.h>
#define maxN 100005
using namespace std;
int l[maxN],r[maxN];
vector<int> v[maxN];
bool seen[maxN];
int cnt;
vector<int> drum[maxN];
int n,m,x,y;
inline int path(int nod)
{
    if(seen[nod]) return 0;
    seen[nod]=1;
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
        if(!r[*it])
        {
            l[nod]=*it;
            r[*it]=nod;
            return 1;
        }
    }
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
        if(path(r[*it]))
        {
            l[nod]=*it;
            r[*it]=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++)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);

       //  v[y].push_back(x);
    }
    int augment=1;
    while(augment)
    {
        augment=0;
        memset(seen,0,sizeof(seen));
        for(int i=1;i<=n;i++)
        {
            if(!l[i]) augment|=path(i);
        }
    }

    int cuplaj=0;
    for(int i=1;i<=n;i++)
        if(l[i]) cuplaj++;
    printf("%d\n",n-cuplaj-1);
    for(int i=1;i<=n;i++)
    {
     if(!r[i])
        {
            x=i;
            cnt++;
            while(l[x])
            {
                drum[cnt].push_back(x);
                x=l[x];
            }
            drum[cnt].push_back(x);
        }
    }
    for(int i=1;i<cnt;i++)
        printf("%d %d\n",drum[i].back(),drum[i+1][0]);
    for(int i=1;i<=cnt;i++)
    {
        int sz=drum[i].size();
        for(int j=0;j<sz;j++)
            printf("%d ",drum[i][j]);
    }
    return 0;
}