Cod sursa(job #188205)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 7 mai 2008 07:58:50
Problema Strazi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<stdio.h>   
#include<string.h>   
int a[255][255],i,j,n,dr[255],st[255],viz[255],nr,m,r[255][255],u[255];
int cupl(int nod){
	int i;
	if(viz[nod])
		return 0;
	viz[nod]=1;
	for(i=1;i<=n;i++)
		if(a[nod][i])   
    if(!dr[i]||cupl(dr[i])){
		st[nod]=i;
		dr[i]=nod;
		return 1;
	}
	return 0;
}   
void cuplaj(){
	for(i=1;i<=n;i++)
		if(!st[i])
	if(cupl(i))
		nr++;   
	else{   
        memset(viz,0,sizeof(viz));   
        if(cupl(i))
			nr++;
	}
}
int main(){
	freopen("strazi.in","r",stdin);
	freopen("strazi.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(;m;m--){
		scanf("%d %d",&i,&j);
		a[i][j]=1;
	}
	cuplaj();
	nr=n;
	while(nr){
		for(i=1;i<=n;i++)
			if(!u[i]&&!dr[i])
				break;
		r[++m][0]=1;
		r[m][1]=i;
		u[i]=1; nr--;
		while(st[i]){
			i=st[i];
			r[m][++r[m][0]]=i;
			u[i]=1;nr--;
		}
	}
	printf("%d\n",m-1);
	for(i=1;i<m;i++)
		printf("%d %d\n",r[i][r[i][0]],r[i+1][1]);
	for(i=1;i<=m;i++)
		for(j=1;j<=r[i][0];j++)
			printf("%d ",r[i][j]);
	fclose(stdin);
	fclose(stdout);
	return 0;
}