Cod sursa(job #166948)

Utilizator DorinOltean Dorin Dorin Data 28 martie 2008 18:27:50
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
# include <stdio.h>
# include <string.h>
# include <vector>

using namespace std;

# define input "felinare.in"
# define output "felinare.out"

# define max 8200

# define minim(a,b) (a<b?a:b)

int n,i,j,T,r,m,x,y;
//int v[max][max];
vector <int> v[max];
int st[max],dr[max],lf[max],rt[max];
int nr;
int u[max];

int cupleaza(int nod)
{
    if(u[nod]) return 0;
    int i,j;
    u[nod] = 1;
	for(j=0;j<v[nod].size();j++)
    {
        i = v[nod][j];
        if(!dr[i] || cupleaza(dr[i]))
        {
            st[nod] = i;
            dr[i] = nod;
            lf[nod] = 1;
            return 1;
        }
    }
    return 0;
}

void cherche(int nod)
{
     int i,j;
     for(j = 0;j<v[nod].size();j++)
     {
           i = v[nod][j];
           if(!rt[i])
           {
                     rt[i] = 1;
                     lf[dr[i]] = 0;
                     cherche(dr[i]);
           }
     }
}

void cuplaj()
{
     int i;
     for(i = 1;i<= n;i++)
     {
           if(st[i]) continue;
           if(cupleaza(i))nr++;
           else
           {
               memset(u,0,sizeof(u));
               if(cupleaza(i))  nr++;
           }
     }
     for(i=1;i<=n;i++)
        if(!lf[i])
           cherche(i);
}

int main()
{
    freopen(input, "r", stdin);
    freopen(output, "w", stdout);
    
    scanf("%d%d",&n,&m);
    
    for(i=1;i<=m;i++)
	{
	   scanf("%d%d",&x,&y);
//	   v[x][++v[x][0]] = y;
       v[x].push_back(y);
    }
    
    cuplaj();
/*    for(i=1;i<=n;i++)
	   printf("%d %d\n",st[i] , dr[i]);*/


	printf("%d\n",2*n-nr);
	
	for (i = 1; i <= n; ++i)
		printf("%d\n", 1-lf[i]+2*(1-rt[i]));
    
    return 0;
}