Cod sursa(job #3073)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 20 decembrie 2006 17:53:44
Problema Taramul Nicaieri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define fin "harta.in"
#define fout "harta.out"
#define NMAX 101
int n,m,grad[NMAX][3],v[NMAX][NMAX];
FILE *in,*out;
//0 ext, 1 int

int main() {
register int i,j,y,aux[NMAX][2];
	in=fopen(fin,"r"); out=fopen(fout,"w");
	fscanf(in,"%i",&n);
	for (i=1;i<=n;++i) { 
		
		fscanf(in,"%i%i",&grad[i][0],&grad[i][1]);
		
	}

	srand(time(0));
	
	do {
		for (i=1;i<=n;++i) { 
			aux[i][0]=grad[i][0];
			aux[i][1]=grad[i][1];
		}
		
		for (i=1;i<=n;++i)
		for (j=1;j<=n;++j) v[i][j]=0;

		for (i=1;i<=n;++i) {
			
			j=0;

			while (aux[i][0] && j<=n) {
				
				y=rand()%n+1;
				
				++j;

				if (!v[i][y] && !v[y][1] && y!=i) { 
					
					v[i][y]=1;
					aux[i][0]--;
					aux[y][1]--;
				
				}

			}
		}	
		
		for (j=1;j<=n && !aux[j][0] && !aux[j][1];++j);
			
	} while (j<=n);
	
	for (i=1;i<=n;++i)
	for (j=1;j<=n;++j) 
		if (v[i][j]) ++m; 
			
		
	fprintf(out,"%i\n",m);

	for (i=1;i<=n;i++)
	for (j=1;j<=n;++j) 
		if (v[i][j]) 
		fprintf(out,"%i %i\n",i,j);
		
	fclose(in); fclose(out);

	return 0;	
}