Jump to content
Hostul a fost schimbat. Daca vedeti serverul offline readaugati rpg.b-zone.ro sau 141.95.124.78:7777 in clientul de sa-mp ×

[C++] Grafuri orientate


Dookie
 Share

Recommended Posts

 

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.

graf-orientat.png?1

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).

graf-orientat.png?1

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 by Dookie
Link to comment
Share on other sites

  • Dookie locked this topic
Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.