#include <iostream>
#include <fstream>
#include <sstream>
#define LNF 50
typedef int vectorI[LNF];
typedef int matriceI[LNF][LNF];
typedef char sir[LNF];
using namespace std;
void citireMatrice(matriceI mat, int &nElem)
{
int l_i=0, l_j=0;
cout << "Introdu numarul de noduri: ";
cin >> nElem;
for (l_i=0; l_i<nElem; l_i++)
{
for (l_j=0; l_j<nElem; l_j++)
{
cout << "Introdu elementul matricii " << "mat[" << l_i+1 << "][" << l_j+1 << "]: ";
cin >> mat[l_i][l_j];
}
}
nElem=l_i; //nElem=l_j;
cout << endl;
}
void afisareMatrice(matriceI mat, int nElem)
{
int l_i, l_j;
for (l_i=0; l_i<nElem; l_i++)
{
for (l_j=0; l_j<nElem; l_j++)
{
cout << " "
<< mat[l_i][l_j];
}
cout << endl;
}
}
void afisareVector(vectorI vect, int n)
{
int l_i;
for (l_i=0; l_i<n; l_i++)
{
cout << vect[l_i]
<< " ";
}
cout << endl;
}
void gradeMaxim(matriceI mat, int nElem, vectorI vectMax, int &nv)
{
int l_i, l_j, l_k;
int gradMax, gradNod;
gradMax=0;
l_k=0;
for (l_i=0; l_i<nElem; l_i++)
{
gradNod=0;
for (l_j=0; l_j<nElem; l_j++)
{
if (mat[l_i][l_j]==1)
gradNod++;
}
if (gradNod>=gradMax)
{
gradMax=gradNod;
}
}
for (l_i=0; l_i<nElem; l_i++)
{
gradNod=0;
for (l_j=0; l_j<nElem; l_j++)
{
if (mat[l_i][l_j]==1)
gradNod++;
}
if (gradNod==gradMax)
{
vectMax[l_k++]=l_i+1;
}
}
nv=l_k;
}
void gradeMinim(matriceI mat, int nElem, vectorI vectMin, int &nv)
{
int l_i, l_j, l_k;
int gradMin, gradNod;
gradMin=1000000;
l_k=0;
for (l_i=0; l_i<nElem; l_i++)
{
gradNod=0;
for (l_j=0; l_j<nElem; l_j++)
{
if (mat[l_i][l_j]==1)
gradNod++;
}
if (gradNod<=gradMin)
{
gradMin=gradNod;
}
}
for (l_i=0; l_i<nElem; l_i++)
{
gradNod=0;
for (l_j=0; l_j<nElem; l_j++)
{
if (mat[l_i][l_j]==1)
gradNod++;
}
if (gradNod==gradMin)
{
vectMin[l_k++]=l_i+1;
}
}
nv=l_k;
}
void xGrad(matriceI mat, int nElem, vectorI vectGradeMax, int &nv, int gradDeVerificat)
{
int l_i, l_j, l_k, l_q=0;
int gradNod;
vectorI vectGrade;
for (l_i=0; l_i<nElem; l_i++)
{
gradNod=0;
for (l_j=0; l_j<nElem; l_j++)
{
if (mat[l_i][l_j]==1)
{
gradNod++;
}
}
vectGrade[l_i]=gradNod;
}
for (l_k=0; l_k<nElem; l_k++)
{
if (vectGrade[l_k]==gradDeVerificat)
{
vectGradeMax[l_q++]=l_k+1;
}
}
nv=l_q;
}
int main(void)
{
matriceI Mat;
vectorI VectMax, VectMin, VectGradeMax;
int nEleml, nev;
int gradCautat;
citireMatrice(Mat, nEleml);
afisareMatrice(Mat, nEleml);
cout << endl;
gradeMaxim(Mat, nEleml, VectMax, nev);
cout << "Nodul/nodurile de grad maxim: ";
afisareVector(VectMax, nev);
gradeMinim(Mat, nEleml, VectMin, nev);
cout << "Nodul/nodurile de grad minim: ";
afisareVector(VectMin, nev);
cout << endl;
cout << "Introdu gradul cautat: ";
cin >> gradCautat;
xGrad(Mat, nEleml, VectGradeMax, nev, gradCautat);
if (nev>0)
{
cout << "Nodurile de gradul " << gradCautat << " sunt: ";
afisareVector(VectGradeMax, nev);
}
else
{
cerr << "Nu exista noduri de gradul cautat!!!" << endl;
}
cout << endl;
return 0;
}