Cod sursa(job #1038338)

Utilizator robertc1Robert Ciobotaru robertc1 Data 21 noiembrie 2013 13:05:02
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cstdio>
#define NMAX 10000
#define MMAX NMAX*5
#define IN "ctc.in"
#define OUT "ctc.out"
using namespace std;


void citire();
void rezolva();
void afisare();
void DFS(int);
void DFST(int);

int n,m;
int viz[NMAX],Vp[NMAX];
int M[NMAX][NMAX],Mt[NMAX][NMAX];

int main()
{
    citire();
    rezolva();
    //afisare();
    return 0;
}


void citire()
{
    int i,x,y;
FILE*fin=fopen(IN,"r");
fscanf(fin,"%d%d",&n,&m);

for(i=1;i<=m;i++)
    {
    fscanf(fin,"%d%d",&x,&y);
    M[x][y]=1;
    Mt[y][x]=1;
    }
}

void rezolva()
{
    int i;
for(i=1;i<=n;i++)
    if(viz[i]==0) DFS(i);
for(i=n;i>=1;i--)
    if(viz[Vp[i]]==1) DFST(Vp[i]);//pe graf transpus


}

void DFS(int a)
{
int St[NMAX],v,k,y,i,contor=0;

St[1]=a;
viz[a]=1;

k=1;
    while(k>0)
    {
        v=St[k];
        y=0;
        for(i=1;i<=n;i++)
        {
            if(M[v][i] == 1 && viz[i] == 0)
            {
                y = i;
                break;
            }
        }
        if(y == 0) k--;
        else
        {
            viz[y] = 1;
            contor++;
            Vp[contor]=y;
            St[++k] = y;
        }
        contor++;
        Vp[contor]=v;
    }
contor++;
Vp[contor]=a;
}


void DFST(int a)
{
    int St[NMAX],v,k,y,i,contor=0;

FILE*fout=fopen(OUT,"w");
fprintf(fout,"%d",a);
St[1]=a;
viz[a]=0;

k=1;
    while(k>0)
    {
        v=St[k];
        y=0;
        for(i=1;i<=n;i++)
        {
            if(M[v][i] == 1 && viz[i] == 0)
            {
                y = i;
                break;
            }
        }
        if(y == 0) k--;
        else
        {
            viz[y] = 0;
            fprintf(fout," %d",y);
            St[++k] = y;
        }
    }
    fprintf(fout,"\n");
}