Cod sursa(job #913603)

Utilizator valentina506Moraru Valentina valentina506 Data 13 martie 2013 17:17:21
Problema Felinare Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<fstream>
#include<vector>
#include<cstring>
using namespace std;

int i,j,n,m,x,y,c[17010],ok,uz[17010],rez;
vector<int> a[17010];
inline int cuplaj(int nod)
{
    int i;
    if(uz[nod])
        return 0;
    uz[nod]=1;
    for(i=0;i<a[nod].size();++i)
        if(!c[a[nod][i]])
        {
            c[nod]=a[nod][i];
            c[a[nod][i]]=nod;
            return 1;
        }
        for(i=0;i<a[nod].size();++i)
            if(cuplaj(c[a[nod][i]]))
            {
                c[nod]=a[nod][i];
                c[a[nod][i]]=nod;
                return 1;
            }
            return 0;
}
void det(int nod)
{
    int i;
    for(i=0;i<a[nod].size();++i)
        if(!uz[a[nod][i]])
        {
            uz[a[nod][i]]=1;
            uz[c[a[nod][i]]]=0;
            det(c[a[nod][i]]);
        }
}
int main()
{
    ifstream f("felinare.in");
    ofstream g("felinare.out");
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y;
        a[x].push_back(y+n);
    }
    ok=0;
    while(!ok)
    {
        ok=1;
        memset(uz,0,sizeof(uz));
    for(i=1;i<=n;++i)
    if(!c[i]&&cuplaj(i))
        ok=0;
    }
    memset(uz,0,sizeof(uz));
    for(i=1;i<=n;++i)
        if(c[i])
            uz[i]=1,rez-=uz[i];
        for(i=1;i<=n;++i)
            if(!c[i])
                det(i);
            rez=2*n;
    for(i=1;i<=2*n;++i)
        rez-=uz[i];
        g<<rez<<"\n";
    return 0;
}