Pagini recente » Cod sursa (job #2534771) | Cod sursa (job #57928) | Cod sursa (job #1919970) | Cod sursa (job #1939148) | Cod sursa (job #125155)
Cod sursa(job #125155)
#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;
}