Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
1 2
4
3
G=(X,U);
X={1,2,3,4,5};
U={(1,4),(4,1),(1,2),(2,3),(4,3),(5,2),(5,3)};
1 6
2
4 3
a grafului orientat
2
1
1 2 3 4
3
1 0 1 1 0
1 22
3 2 0 0 0 0
3 0 0 0 0
4 5
4
4 1 1 1 0
0, in caz contrar
Matricea de adiacenta a unui graf orientat nu mai este simetrica fata
de diagonala principala.
Struct arc
}v[100];
2
i S(i)
1 1 2,3,4
2 -
3 2,4
3
4 2
6
2
5
455
555
4. Probleme
Problema 1: Se da un graf orientat tare conex cu n varfuri si m arce prin lista arcelor. Se
numeste varf central un varf cu proprietatea ca suma distantelor de la el la toate celelalte
varfuri este minim. Distanta de la i la j este egala cu lungimea celui mai scurt drum de la i la j.
Afisati varfurile centrale ale grafului. Se va folosi un algoritm de tip breadth-first.
Exemplu:
graf.in
813
12
13
23
34
45
56
67
87
78
81
63
62
64
graf.out
6
Rezolvare:
#include <fstream>
using namespace std;
ifstream fin("graf.in");
ofstream fout("graf.out");
int n,m,A[101][101],P[101],D[101],Q[101],dmin=100,S[101];
int Suma_distante(int x)
{//distantele minime cu BF
int st=1,dr=1;
Q[1]=x;
P[x]=1;
D[x]=0;
while(st<=dr)
{
int v=Q[st];
for(int i=1;i<=n;i++)
if(!P[i] && A[v][i])
{
dr++;
Q[dr]=i;
P[i]=1;
D[i]=D[v]+1;
}
st++;
}
int s=0;
for(int i=1;i<=n;i++)
s=s+D[i];
return s;
}
int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
fin>>x>>y;
A[x][y]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
P[j]=0;
S[i]=Suma_distante(i);
if(S[i]<dmin) dmin=S[i];
}
for(int i=1;i<=n;i++)
if(S[i]==dmin)
fout<<i<<" ";
return 0;
}