Cod sursa(job #2676232)

Utilizator Silviu45Dinca Silviu Silviu45 Data 23 noiembrie 2020 19:38:42
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.5 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");

int matrice_adiacenta[50][50];
int matrice_lanturi[50][50];
int numar_varfuri;

void Citire()
{
    fin>>numar_varfuri;
    for(int i=1; i<=numar_varfuri; i++)
    {
        for(int j=1; j<=numar_varfuri; j++)
        {
            fin>>matrice_adiacenta[i][j];
            matrice_lanturi[i][j] = matrice_adiacenta[i][j];
        }
    }
}

void afisare()
{
    for(int i=1; i<=numar_varfuri; i++)
    {
        for(int j=1; j<=numar_varfuri; j++)
        {
            cout<<matrice_lanturi[i][j]<<" ";
        }
        cout<<endl;
    }
}
void Formare_matrice_lanturi()
{
    for(int k=1; k<=numar_varfuri; k++)
    {
        for(int i=1; i<=numar_varfuri; i++)
        {
            for(int j=1; j<=numar_varfuri; j++)
            {
                if(matrice_lanturi[i][j]==0 && i!=k && j!=k && i!=j)
                {
                    matrice_lanturi[i][j] = matrice_lanturi[i][k] * matrice_lanturi[k][j];
                }
            }
        }
    }
}
//componenta tare conexa
void Componenta_Tare_Conexa(int varf_pornire,int vizitati[50],int v[50],int &dimv)
{
    dimv++;
    v[dimv] = varf_pornire;
    vizitati[varf_pornire] = 1;
    for(int i=1; i<=numar_varfuri; i++)
    {
        if(matrice_lanturi[i][varf_pornire]==1 && matrice_lanturi[varf_pornire][i]==1)
        {
            dimv++;
            v[dimv] = i;
            vizitati[i] = 1;
        }
    }
}
//afisare toate componentele tare conexe
void ToateComponenteleTareConexe(int vizitati[50])
{
    int p = 0;
    int v[50];
    int dimv = 0;
	int result[50][50];
	
    for(int i=1; i<=numar_varfuri; i++)
    {
        dimv = 0;
        if(vizitati[i]==0)
        {
            p++;
            Componenta_Tare_Conexa(i,vizitati,v,dimv);
            //cout<<"componenta conexa "<<p<<" este : ";
            for(int j=1; j<=dimv; j++)
            {
                result[p][j] = v[j];
            }
            //fout<<endl;
        }
    }
	
	fout << p << "\n";
	for(int c = 1; c <= p; c++){
		int j = 1; 
		while(result[c][j] != 0){
			fout << result[c][j] << " ";
			j++;
		}
		fout << "\n";
	}
	
}

int main()
{
    int vizitati[50] = {0};
    int dim  = 0;
    int vector_componenta[50];
    Citire();
    Formare_matrice_lanturi();
    //afisare();
    ToateComponenteleTareConexe(vizitati);

    fin.close();
	fout.close();
    return 0;
}