Cod sursa(job #1039094)

Utilizator raduiulianRadu Iulian Mihai raduiulian Data 22 noiembrie 2013 15:18:54
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>

using namespace std;

int n, a[15][15], vizitat[30], st[30], vf, m;
ifstream f("graf20.txt");
void citeste()
{
    f>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            f>>a[i][j];
}
int cauta()
{
    for(int i=1;i<=n;i++)
        if(vizitat[i]==0)
            return i;
    return 0;
}
void zero(int x[])
{
    for(int i=1;i<=n;i++)
    x[i]=0;
}
void init(int k)
{
    vf=1;
    st[vf]=k;
}
int este_vida()
{
    return vf==0;
}
void adaug(int i, int x[])
{
    vf++;
    st[vf]=i;
    x[i]=1;
}
void elimin()
{
    vf--;
}
void prelucrare1(int x[])
{
    int i=1, k=st[vf];
    x[k]=1;
    while(i<=n&&(a[i][k]==0||(a[i][k]==1&&x[i]==1)))
    i++;
    if(i==n+1)
    elimin();
    else adaug(i,x);
}
void prelucrare2(int x[])
{
    int i=1, k=st[vf];
    x[k]=1;
    while(i<=n&&(a[k][i]==0||(a[k][i]==1&&x[i]==1)))
    i++;
    if(i==n+1)
    elimin();
    else adaug(i,x);
}
void comp(int x[], int y[])
{
    for(int i=1;i<=n;i++)
        if(x[i]==1&&y[i]==1)
        {
             cout<<i<<" ";
             vizitat[i]=1;
        }

}
int main()
{
    int k, pred[20], succ[20];
    citeste();
    cout<<"nodul de start:";
    cin>>k;
    k=cauta();
    m++;
    cout<<"componentele tare conexe: "<<endl;
    while(k)
    {
        cout<<endl<<m<<": ";
        init(k);
        zero(pred);
        while(!este_vida())
            prelucrare1(pred);
        init(k);
        zero(succ);
        while(!este_vida())
        prelucrare2(succ);
        comp(pred, succ);
        k=cauta();
        m++;
    }
    return 0;
}