Documente Academic
Documente Profesional
Documente Cultură
}
if (!gasit)
nr_c = stergere_stiva(stiva, nr_c);
}
delete stiva;
delete m;
}
void main()
{
int n, v0, **a, m, i, j, vf1, vf2;
//preiau graful de la tastatura
printf("Numarul de varfuri:");
scanf("%i", &n);
a = aloca(n, n);
for (i = 0; i<n; i++)
for (j = 0; j <= i; j++)
a[j][i] = a[i][j] = 0;
printf("Numarul de muchii:"); scanf("%i,", &m);
for (i = 0; i<m; i++)
{
printf("Varful initial:"); scanf("%i", &vf1);
printf("Varful final:"); scanf("%i", &vf2);
a[vf1 - 1][vf2 - 1] = a[vf2 - 1][vf1 - 1] = 1;
}
printf("\nVarful initial pentru parcurgerea DF");
scanf("%i", &v0);
printf("\nOrdinea de vizitare a varfurilor grafului este:");
depth_first(v0 - 1, a, n);
a = dezalocare(a, n);
_getch();}
Pb 2- Acest program verifica daca graful este conex si se afiseaza toate componentele sale
conexe;
#include<stdio.h>
#include<conio.h>
int n, m, a[20][20], viz[20], nrc = 0;
void viziteaza(int nod)
{
int i;
viz[nod] = nrc;
for (i = 1; i <= n; i++)
if (a[nod][i] == i && viz[i] == 0)
viziteaza(i);
}
void main()
{
int nod, i, j, x, y;
printf("Introdu numarul de noduri:");
scanf("%d", &n);
printf("Introdu numarul de muchii:");
scanf("%d", &m);
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
a[i][j] = 0;
printf("Introdu muchiile:\n");
for (i = 1; i <= m; i++)
{
printf("De la nodul: ");
scanf("%d", &x);
printf("La nodul:");
scanf("%d", &y);
a[x][y] = a[y][x] = 1;
}
for(nod=1;nod<=n;nod++)
if (viz[nod] == 0)
{
nrc++;
viziteaza(nod);
if (nrc == 1)
printf("Graful este conex!\n");
else
printf("Graful nu este conex!\n");
for (i = 1; i <= nrc; i++)
{
printf("Componenta %d:", i);
for (j = 1; j <= n; j++)
if (viz[j] == i)
printf("%d", j);
printf("\n");
}
_getch();
}
}
Pb 3-Acest program presupune aplicarea algoritmului lui Kruskal.
#include<stdio.h>
#include<conio.h>
void main()
{
int cost, i, j, nv, nm, a[100][3];
//graful este preluat de la tastatura
printf("Numarul de virfuri:"); scanf("%i", &nv);
printf("Numarul de muchii:"); scanf("%i", &nm);
printf("Matricea de reprezentare\n");
for (i = 0; i<nm; i++)
{
printf("Muchia %i si ponderea:", i + 1);
for (j = 0; j<3; j++)
scanf("%i", &a[i][j]);
}
for (i = 0; i<nm; i++)
for (j = 0; j<2; j++)a[i][j]--;
printf("Arborele de cost minim: \n");
cost = kruskal(a, nm, nv);
printf("\ncu costul %i", cost);
_getch();
}
i = 1; //restartam i
while (i <= n && v[1][i] == 1) i++;
if (i == n + 1)
return 0; //daca au fost toate prelucrate iesi din functie
else
{
for (i = 1;i <= n;i++)
if (v[0][i] == cautata && v[1][i] == 0) //daca nu a fost vizitat si
daca am gasit vom afisa varful corespunzator
{
printf("%d ", i);
v[1][i] = 1; //a fost prelucrat
cauta(v, n, i); //continuam cautarea pt urmatorul nod
gasit = 1;
}
if (gasit == 0)
cauta(v, n, v[0][cautata]); //daca nu am gasit altul intoarce-te
inapoi cu un pas (cauta parintele / urca-te mai sus pe arborele cautarii)
}
}
void main()
{
int v[2][100], i, n; //pe prima linie a matricei avem parintii iar pe a doua 0-
nevizitat si 1-vizitat/prelucrat
printf("cate varfuri? "); scanf("%d",&n);
printf("Vector parinti pentru cele %d varfuri: \n",n);
for (i = 1;i <= n;i++)
{
scanf("%d", &v[0][i]);
v[1][i] = 0; //toti sunt nevizitati la inceput
}
printf("\n");
printf("Drumuri de la varf initial (parintele tuturor) la noduri frunza:\n");
cauta(v, n, 0);
printf("\n\n");
}
Pb 5 Problema preia din tabela de muchii si parcurge in latime folosind vector de
distante:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INF 10000
fclose(f);
}
return t; //returnam tabela de muchii
}
//construire matr adiac stiind tabela de muchii
char** tab2ad(int n, int m, unsigned char** t) //returnam matricea; de aceea char**; tab
to ad = from TABel to ADiacent matrix
{
char** a; //matricea a
int i, j;
a = new char*[n];
for (i = 0;i < n;i++)
a[i] = new char[n];
for (i = 0;i < n;i++)
for (j = 0;j < n;j++)
a[i][j] = 0; //umplem toata matricea cu 0
for (i = 0;i < m;i++)
{
a[t[i][0] - 1][t[i][1] - 1] = 1; //indicele in matrice e vf-1; umplem
matricea cu 1 unde avem muchii
a[t[i][1] - 1][t[i][0] - 1] = 1; //ne asiguram ca umplem simetric
}
return a;
}
d = new int[n];
p = new int[n];
lista = new unsigned char[n];
nvp = 0;//nr vf prelucrate e 0 la inceput
for (i = 0;i < n;i++)
d[i] = p[i] = INF;
d[v0 - 1] = 0; //distanta de la vf initial la el insusi e 0; indice corespunzator
e cu -1
p[v0 - 1] = 0; //vf init nu are parinte
i = 0;//distanta porneste de la zero si va creste in while
gata = 0; //pt a stii daca am gasit sau nu noi varfuri nevizitate
while (!gata)
{
gata = 1;
for(j=0;j<n;j++) // j este indicele varfului
if (d[j] == i) //daca am gasit un varf cu o anumita distanta cautata
{
v = j + 1;//vf curent- nu aveam neaparata nev de variabila v
lista[nvp++] = v; //trecem in lista de ordine varful; creste
nr de vf prelucrate
for(k=0;k<n;k++)
if (a[j][k] == 1 && d[k] == INF) //cautam pe linia
varfului unde avem 1 inseamna ca are vecin / exista muchie; sa aiba distanta infinit =
nevizitat inca
{
//daca am gasit un vecin nevizitat
d[k] = i + 1; //ii trecem distanta
p[k] = v; //trecem parintele
gata = 0;
}
}
i++;//crestem distanta
}
delete d; // nu mai avem nev de vector distante
return lista;//returnam lista cu ordinea-un vector
}
void main()
{
char numef[50] = "..\\graf.txt";
int nr_vf, nr_muc;
int i;
unsigned char** tab; //tabela muchii
char** ad; //matr adiacenta
int vi;//vf initial
unsigned char* ordine; //lista de ordine
int* parinti;
int vparc; //nr vf parcurse
tab = citire_graf_neor(numef,&nr_vf,&nr_muc);
if (tab==NULL)
printf("\nNu pot deschide fisierul. Nu se poate prelua\n");
else
{
ad = tab2ad(nr_vf, nr_muc, tab);
printf("\nVf. initial: "); scanf("%d",&vi);
ordine = BF_distante(ad,nr_vf,vi,vparc,parinti);
printf("\nOrdine de parcurgere: ");
for (i = 0;i < vparc;i++)
printf("%d ",ordine[i]);
printf("\nParinti:");
for (i = 0;i < nr_vf;i++)
printf("\nVf %2d a fost descoperit de vf %2d",i+1,parinti[i]);
}
printf("\n\n");
}
Pb 6-Convertire reprezentare tabelara a unui graf in reprezentare matriceala-pentru graf
neponderat se genereaza matricea de adiacenta.
#include <stdio.h>
#include <malloc.h>
#include <stdio.h>
void main()
{
int n, m, a[100][100];
int i, j;
citire(&n,&m,a);
for (i = 0; i < n; i++)
if (grad(i+1,n,a) >= 2)
{
for (j = 0; j < n; j++)
if (a[i][j] == 1)
printf("[%d,%d] ",i+1,j+1);
printf("\n");
}