Cod sursa(job #1048630)

Utilizator MarghescuGabriel Marghescu Marghescu Data 6 decembrie 2013 10:07:34
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>

using namespace std;

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

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

void read ()
{
	f>>n>>m;
	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;
		}
	}
	for(int i=1;i<=m;i++)
	{
		f>>x>>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;
		}
	}
}
void 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];
				}
			}
		}
	}
}
void 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];
				}
			}
		}
	}
}
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<=lg;i++)
	{
		if (i!=dis)
			g<<f_sol[i]<<" ";
		if (i==dis)
		{
			g<<"\n";
			g<<f_sol[i]<<" ";
		}
	}

}

int main()
{
	read();
	graf_init();
	graf_transpus();
	solve();

	f.close();
	g.close();
	return 0;
}