Cod sursa(job #125155)

Utilizator coderninuHasna Robert coderninu Data 20 ianuarie 2008 11:43:51
Problema Strazi Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasele 11-12 Marime 1.49 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#define Nmax 256
#define Bit 27

using namespace std;

int n, m, i, x, y, nr, j, nrs;
vector <int> g[Nmax];
long uz[20], sters[20];
char drum[Nmax+2];
char drumMin[Nmax][Nmax+2];


void DFS(char x)
{
	for (int i=1; i<=g[x][0]; i++)
		if (!((uz[g[x][i]/Bit])&(1<<(g[x][i]%Bit))) && !((sters[g[x][i]/Bit])&(1<<(g[x][i]%Bit))))
		{
			drum[++drum[0]]=g[x][i];
			uz[g[x][i]/Bit]|=1<<(g[x][i]%Bit);
			if (drum[0]>drumMin[nr][0])
				memcpy(drumMin[nr], drum, strlen(drum));
			DFS(g[x][i]);
			drum[drum[0]]=0;
			drum[0]--;
			uz[g[x][i]/Bit]^=1<<(g[x][i]%Bit);
		}
}

int main()
{
	freopen("strazi.in", "r", stdin);
	scanf("%d %d\n", &n, &m);
        for (i=1; i<=n; i++) g[i].push_back(0);
        for (i=1; i<=m; i++)
	{
		scanf("%d %d\n", &x, &y);
		g[x].push_back(y);
                g[x][0]++;
	}
	fclose(stdin);

	while (nrs<n)
	{
		nr++;
		for (i=1; i<=n; i++)
			if (!(sters[i/Bit]&(1<<(i%Bit))))
			{
				drum[0]=1; drum[1]=i;
				DFS(i);
				if (!drumMin[nr][0]) memcpy(drumMin[nr], drum, strlen(drum));

			}
		for (i=1; i<=drumMin[nr][0]; i++)
			sters[drumMin[nr][i]/Bit]|=1<<(drumMin[nr][i]%Bit);
		nrs+=drumMin[nr][0];
	}
	freopen("strazi.out", "w", stdout);
	printf("%d\n", nr-1);
	for (i=1; i<nr; i++) printf("%d %d\n", drumMin[i][drumMin[i][0]], drumMin[i+1][1]);
	for (i=1; i<=nr; i++)
		for (j=1; j<=drumMin[i][0]; j++)
			printf("%d ", drumMin[i][j]);
	fclose(stdout);
	return 0;
}