Cod sursa(job #124833)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 19 ianuarie 2008 23:38:31
Problema Strazi Scor Ascuns
Compilator cpp Status done
Runda Marime 1.04 kb
#include <stdio.h>
#include <string.h>

#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define nmax 256

int n,l[nmax],r[nmax],sol,m;
char G[nmax][nmax],viz[nmax];

int pairup(int i)
{
	if(viz[i]) return 0;
	viz[i]=1;
	int j;
	FOR(j,0,n)
		if(G[i][j] && l[j]==-1)
		{
			r[i]=j, l[j]=i;
			return 1;
		}
	FOR(j,0,n)
		if(G[i][j] && pairup(l[j]))
		{
			r[i]=j, l[j]=i;
			return 1;
		}
	return 0;
}

int main()
{
	freopen("strazi.in","r",stdin);
	freopen("strazi.out","w",stdout);
	int i,j,ii,a;
	scanf("%d %d",&n,&m);
	memset(G,0,sizeof(G));
	FOR(ii,0,m)
	{
		scanf("%d %d",&i,&j);
		i--,j--;
		G[i][j]=1;
	}
	memset(l,-1,sizeof(l));
	memset(r,-1,sizeof(r));
	memset(viz,0,sizeof(viz));
	FOR(i,0,n)
		if(pairup(i))
			sol++,memset(viz,0,sizeof(viz));
	printf("%d\n",n-sol-1);
	FOR(i,0,n)
		if(l[i]==-1)
			break;
	a=i;
	FOR(j,0,n)
	{
		if(r[i]==-1)
			FOR(ii,0,n)
				if(l[ii]==-1&& ii!=a)
				{
					printf("%d %d\n",i+1,ii+1);
					l[ii]=i, r[i]=ii;
					break;
				}
		i=r[i];
		viz[i]=1;
	}
	ii=a;
	FOR(i,0,n)
		printf("%d ",ii+1),ii=r[ii];
	printf("\n");
	return 0;
}