Cod sursa(job #1048628)

Utilizator shagarthAladin shagarth Data 6 decembrie 2013 10:03:24
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>

using namespace std;

ifstream f("date.in");
ofstream g("date.out");

int a[20][20],t[20][20],sol[20][20],n,x,y,used[10],f_sol[100],lg=0,dis;

void read ()
{
	f>>n;
	for (int i=1; i<=9; i++)
	{
		used[i]=0;
	}
	for (int i=1; i<=n; i++)
	{
		for (int j=1; j<=n; j++)
		{
			a[i][j]=0;
			t[i][j]=0;
		}
	}
	while (f>>x)
	{
		f>>y;
		a[x][y]=1;
	}
	for (int i=1; i<=n; i++)
	{
		for (int j=1; j<=n; j++)
		{
			if (a[i][j])
			{
				t[j][i]=1;
			}
			else if (a[i][j] && a[j][i])
				t[j][i]=1;
		}
	}
	/*for (int i=1; i<=n; i++)
	{
		for (int j=1; j<=n; j++)
		{
			g<<t[i][j]<<" ";
		}
		g<<"\n";
	}*/

}

void mat_graf_init ()
{
	for (int k=1; k<=n; k++)
	{
		for (int i=1; i<=n; i++)
		{
			for (int j=1; j<=n; j++)
			{
				if (a[i][j]==0 && i!=k && j!=k)
				{
					a[i][j]=a[i][k]*a[k][j];
				}
			}
		}
	}
	/*for (int i=1; i<=n; i++)
	{
		for (int j=1; j<=n; j++)
		{
			g<<a[i][j]<<" ";
		}
		g<<"\n";
	}*/
}

void mat_graf_transpus ()
{
	for (int k=1; k<=n; k++)
	{
		for (int i=1; i<=n; i++)
		{
			for (int j=1; j<=n; j++)
			{
				if (t[i][j]==0 && i!=k && j!=k)
				{
					t[i][j]=t[i][k]*t[k][j];
				}
			}
		}
	}
	/*for (int i=1; i<=n; i++)
	{
		for (int j=1; j<=n; j++)
		{
			g<<t[i][j]<<" ";
		}
		g<<"\n";
	}*/
}

void solve ()
{
	for (int i=1; i<=n; i++)
	{
		for (int j=1; j<=n; j++)
		{
			sol[i][j]=a[i][j]*t[i][j];
			if (sol[i][j] && !used[j])
			{
				lg++;
				f_sol[lg]=j;
				used[j]=1;
			}
		}
	}
	for (int j=1; j<=n; j++)
	{
		if (sol[1][j]==0)
		{
			dis=j;
			j=n;
		}
	}

	/*for (int i=1; i<=n; i++)
	{
		for (int j=1; j<=n; j++)
		{
			g<<a[i][j]<<" ";
		}
		g<<"\n";
	}*/

	for (int i=1; i<=lg; i++)
	{
		if (i!=dis)
			g<<f_sol[i]<<" ";
		if (i==dis)
		{
			g<<"\n";
			g<<f_sol[i]<<" ";
		}
	}

}

int main ()
{
	read ();
	mat_graf_init ();
	mat_graf_transpus ();
	solve ();
	f.close();g.close();
	return 0;
}