Cod sursa(job #183117)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 21 aprilie 2008 19:00:30
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int NMAX=8200;
int n,m,f,st[NMAX],dr[2*NMAX],sst[NMAX],sdr[NMAX];
char viz[NMAX],s[NMAX];
vector<int> a[NMAX];
void citeste(){
     int i,j,k;
     scanf("%d %d",&n,&m);
     for (k=1;k<=m;++k) {scanf("%d %d",&i,&j);
                         a[i].push_back(j);}
     }
void cup(int vf){
     vector<int>::iterator it;
     if (!viz[vf]){
      viz[vf]=1;
      for (it=a[vf].begin();it!=a[vf].end();it++)
       if (st[*it]==-1){
         st[*it]=vf;
         dr[vf]=*it;
         return;}
      for (it=a[vf].begin();it!=a[vf].end();it++){
          cup(st[*it]);
          if (dr[st[*it]]!=*it){
            st[*it]=vf;
            dr[vf]=*it;
            return;}
            }
          }
      }
void cuplaj(){
     int i;
     f=0;
     memset(dr,-1,sizeof(dr));
     for (i=1;i<=n;++i)
      if (dr[i]==-1){
         memset(viz,0,sizeof(viz));
         cup(i);
         if (dr[i]!=-1) f++;}
       else f++;
     }
void sup(int vf){
     vector<int>::iterator it;
     for (it=a[vf].begin();it!=a[vf].end();it++)
       if (!sdr[*it]){
        sdr[*it]=1;
        sst[st[*it]]=0;
        sup(st[*it]);}
     }
void suport(){
     int i;
     memset(sst,0,sizeof(sst));
     memset(sdr,0,sizeof(sdr));
     for (i=1;i<=n;++i)
      if (dr[i]!=-1) sst[i]=1;
     for (i=1;i<=n;++i)
      if (dr[i]==-1) sup(i);
      }
void scrie(){
     int i,k;
     printf("%d\n",2*n-f);
     for (i=1;i<=n;i++){
         if (sst[i]+sdr[i]==0) k=3;
          else if (sst[i]+sdr[i]==2) k=0;
           else if (sst[i]==1) k=2;
            else k=1;
          printf("%d\n",k);}
     }        
int main(){
    freopen("felinare.in","r",stdin);
    freopen("felinare.out","w",stdout);
    citeste();
    cuplaj();
    suport();
    scrie();
    return 0;
}