Dookie Posted October 26, 2017 Share Posted October 26, 2017 (edited) #Nelamuriri? Grafuri orientate Se numeşte graf orientat sau digraf o pereche ordonată de mulțimi notată G=(V, U), unde: V este o mulțime finită şi nevidă ale cărei elemente se numesc noduri sau vârfuri; U este o mulțime de perechi ordonate de elemente distincte din V ale cărei elemente se numesc arce. V={1,2,3,4,5,6}U={(1,6),(2,1),(2,4),(3,2),(4,2),(5,4),(6,1),(6,4)} Noțiuni extremități ale unui arc: pentru arcul u=(x,y), se numesc extremități ale sale nodurile x şi y; x se numeşte extremitate inițială; y se numeşte extremitate finală; y se numește succesor al lui x; x se numește predecesor al lui y. vârfuri adiacente: dacă într-un graf există arcul u=(x,y) (sau u=(y,x), sau amândouă), se spune despre nodurile x şi y că sunt adiacente; incidență: dacă u1 şi u2 sunt două arce ale aceluiaşi graf, se numesc incidente dacă au o extremitate comună. Exemplu: u1=(x,y) şi u2=(y,z) sunt incidente; dacă u1=(x,y) este un arc într-un graf, se spune despre el şi nodul x, sau nodul y, că sunt incidente. Listele de adiacență Pentru un graf orientat cu G=(V,U) se va memora numărul de noduri n și apoi, pentru fiecare nod x, lista succesorilor lui x, adică nodurilor y cu proprietatea că există arcul (x,y). Pentru graful alăturat, listele de adiacență sunt: 1: 6 2: 1 4 3: 2 4: 2 5: 4 6: 1 2 4 La reprezentarea în memorie trebui avut în vedere că dimensiunile listelor de succesori sunt variabile. De aceea, este neeficientă utilizarea unor tablouri alocate static. Astfel, putem folosi: un șir de n tablouri unidimensionale alocate dinamic; un șir de n vectori din STL; un șir de n liste simplu (dublu) înlănțuite alocate dinamic. Probleme Se da un graf orientat cu n varfuri si m arce prin lista arcelor. Se numeste arc inutil un arc cu proprietatea ca are extremitatile in componente tare conexe diferite. Afisati numarul de arce inutile si care sunt acestea. Exemplu: graf.in 8 11 1 3 3 5 5 7 7 1 2 6 6 8 8 2 1 4 4 6 4 8 4 2 graf.out 4 1 4 4 2 4 6 4 8 Solutie: //CU COMPONETELE TARE CONEXE #include <fstream> using namespace std; ifstream fin("graf.in"); ofstream fout("graf.out"); int A[101][101],n,m,S[101],P[101],c,k; void DF_succ(int v, int c) { S[v]=c; for(int i=1;i<=n;i++) if(!S[i] && A[v][i]) DF_succ(i,c); } void DF_pred(int v, int c) { P[v]=c; for(int i=1;i<=n;i++) if(!P[i] && A[i][v]) DF_pred(i,c); } 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++) if(!S[i]) { c++; DF_succ(i,c); DF_pred(i,c); for(int j=1;j<=n;j++) if(S[j]!=P[j]) S[j]=P[j]=0; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(A[i][j]==1) if(S[i]!=S[j]) k++; fout<<k<<endl; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(A[i][j]==1) if(S[i]!=S[j]) fout<<i<<" "<<j<<endl; return 0; } //CU ROY-WARSHALL #include <fstream> using namespace std; ifstream fin("graf.in"); ofstream fout("graf.out"); int A[101][101],B[101][101],n,m,k; void RW() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(B[i][j]==0) B[i][j]=B[i][k]*B[k][j]; } int main() { fin>>n>>m; for(int i=1;i<=m;i++) { int x,y; fin>>x>>y; B[x][y]=A[x][y]=1; } RW(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(A[i][j]==1 && B[j][i]==0) k++; fout<<k<<endl; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(A[i][j]==1 && B[j][i]==0) fout<<i<<" "<<j<<endl; return 0; } Edited October 26, 2017 by Dookie 1 Link to comment Share on other sites More sharing options...
Recommended Posts