Cod sursa(job #1798928)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 5 noiembrie 2016 16:18:45
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("strazi.in");
ofstream g("strazi.out");
int i,j,n,m,tata[256],fiu[256],x,y,nr,ok;
bool viz[256];
vector<int> a[256];
bool cupleaza(int nod)
{
    int i;
    if(viz[nod]) return 0;
    viz[nod]=1;
    for(i=0;i<a[nod].size();++i)
    if(!tata[a[nod][i]]||cupleaza(tata[a[nod][i]]))
    {
        fiu[nod]=a[nod][i];
        tata[a[nod][i]]=nod;
        return 1;
    }
    return 0;
}
int df(int nod)
{
    if(!fiu[nod]) return nod;
    return df(fiu[nod]);
}
void afis(int nod)
{
    if(!nod) return ;
    g<<nod<<' ';
    afis(fiu[nod]);
}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y;
        a[x].push_back(y);
    }
    for(i=1;i<=n;++i)
    {
        memset(viz,0,sizeof viz);
        cupleaza(i);
    }
    for(i=1;i<=n;++i) nr+=(!tata[i]);
    g<<nr-1<<'\n';
    for(i=1;i<=n;++i)
    if(!tata[i])
    {
        x=df(i);
        ok=0;
        for(j=1;j<=n&&!ok;++j)
        if(!tata[j]&&i!=j)
        {
            ok=1;
            g<<x<<' '<<j<<'\n';
            tata[j]=x;
            fiu[x]=j;
        }
    }
    for(i=1;i<=n;++i)
    if(!tata[i]) afis(i);
    return 0;
}