Cod sursa(job #577218)

Utilizator irene_mFMI Irina Iancu irene_m Data 9 aprilie 2011 21:18:49
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <cstdio>
#include <vector>
#define MaxN 9002
#define infile "felinare.in"
#define outfile "felinare.out"

using namespace std;

vector <int> G[MaxN];

int N,M,dr[MaxN],st[MaxN],uz[MaxN],ss[MaxN],sd[MaxN],c;

void read()
{
      int i,x,y;

      scanf("%d%d",&N,&M);
      for(i=1;i<=M;i++)
      {
            scanf("%d%d",&x,&y);
            G[x].push_back(y);
      }
}

int pairs(int nod)
{
      if(uz[nod]) return 0;

      uz[nod]=1;
      int i;

      for(i=0;i<G[nod].size();i++)
            if(!st[G[nod][i]] || pairs(st[G[nod][i]]))
            {
                  dr[nod]=G[nod][i];
                  st[G[nod][i]]=nod;
                  return 1;
            }
      return 0;
}

void pairs2(int nod)
{
      int i;
      for(i=0;i<G[nod].size();i++)
            if(!sd[G[nod][i]])
            {
                  sd[G[nod][i]]=1;
                  ss[st[G[nod][i]]]=0;
                  pairs2(st[G[nod][i]]);
            }
}

void solve()
{
      int sw=1,i;

      while(sw)
      {
            sw=0;
            memset(uz,0,sizeof(uz));
            for(i=1;i<=N;i++)
                  if(!dr[i] && pairs(i))
                        sw=1;
      }

      for(i=1;i<=N;i++)
            if(dr[i]) ss[i]=1;

      for(i=1;i<=N;i++)
            if(!dr[i]) pairs2(i);
}

void write()
{
      int i;

      for(i=1;i<=N;i++)
            if(dr[i]) c++;

      printf("%d\n",2*N-c);

      for(i=1;i<=N;i++)
      {
            if(!ss[i] && !sd[i]) printf("3\n");
            if(ss[i] && !sd[i]) printf("2\n");
            if(!ss[i] && sd[i]) printf("1\n");
            if(ss[i] && sd[i]) printf("0\n");
      }

}

int main()
{
      freopen(infile,"r",stdin);
      freopen(outfile,"w",stdout);

      read();
      solve();
      write();

      fclose(stdin);
      fclose(stdout);
      return 0;
}