Cod sursa(job #1122751)

Utilizator MarghescuGabriel Marghescu Marghescu Data 25 februarie 2014 20:14:49
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <fstream>
#define NMAX 10000
using namespace std;
 
ifstream f("ctc.in");
ofstream g("ctc.out");
 
int a[NMAX][NMAX],t[NMAX][NMAX],sol[NMAX][NMAX],n,x,y,used[NMAX],f_sol[NMAX],lg=0,dis,m;
 
void read ()
{
    f>>n>>m;
    for(int i=1;i<=n;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;
}