Cod sursa(job #964332)

Utilizator misinoonisim necula misino Data 20 iunie 2013 17:03:39
Problema Strazi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<fstream>
#include<vector>
#include<cstring>
using namespace std;
ifstream f("strazi.in");
ofstream g("strazi.out");
int i,j,n,m,nr,x,y,fiu[300],t[300];
vector<int>v[300];
bool viz[300];
inline int cuplaj(int x)
{
    if(viz[x])
    return 0;
    viz[x]=1;
    for(vector<int>::iterator it=v[x].begin();it!=v[x].end();++it)
    if(!t[*it]||cuplaj(*it))
    {
        t[*it]=x;
        fiu[x]=*it;
        return 1;
    }
    return 0;
}
inline int dfs(int x)
{
    if(!fiu[x])
    return x;
    return dfs(fiu[x]);
}
inline void afiseaza(int x)
{
    if(!x)
    return ;
    g<<x<<' ';
    afiseaza(fiu[x]);
}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y;
        v[x].push_back(y);
    }
    for(i=1;i<=n;++i)
    {
        memset(viz,0,sizeof(viz));
        cuplaj(i);
    }
    for(i=1;i<=n;++i)
    if(!t[i])
    ++nr;
    g<<nr-1<<'\n';
    for(i=1;i<=n;++i)
    if(!t[i])
    {
        x=dfs(i);
        for(j=1;j<=n;++j)
        if(i!=j&&!t[j])
        {
            g<<x<<' '<<j<<'\n';
            fiu[x]=j;
            t[j]=x;
            break;
        }
    }
    for(i=1;i<=n;++i)
    if(!t[i])
    {
        afiseaza(i);
    }
    return 0;
}