Bài thực hành 1

Trong bài này bạn cần nắm bắt các mục như sau :

  • Khai báo cấu trúc đồ thị (chủ yếu ma trận đỉnh cung)

  • Các hàm cơ bản đồ thị như nhập cung

  • Tính bậc của 1 đỉnh trong đồ thị

  • Danh sách đỉnh kề của 1 đỉnh

⚠️ LƯU Ý

Tất cả các đỉnh trong đồ thị bắt đầu từ 1 thay vì 0, nên hãy để ý rõ không thì sai !!!

Cấu trúc đồ thị

Danh sách đỉnh cung

typedef struct{
    int A[MAX][MAX];
    int n; //số đỉnh
    int m; //số cung
}Graph;

Danh sách cung

typedef struct {
    int u, v;
    int w;
} Edge;
typedef struct {
    int n, m;
    Edge edges[MAX];
} Graph;

Các hàm thao tác đồ thị

Hàm nhập cơ bản

void makeNullGraph(Graph *G){ //khởi tạo đồ thị rỗng
    G->m = 0;
    G->n = 0;
}

void initGraph(Graph *G, int n){ //khởi tạo đồ thị với n đỉnh
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            G->A[i][j] = 0;
}

void addEdge(Graph *G, int x, int y){ //thêm 1 cung vào đồ thị
    if(G->A[x][y] > 0 && G->A[x][y] > 0) //trường hợp đa cung
        G->A[x][y] = G->A[y][x] += 1;
    else
        G->A[x][y] = G->A[y][x] = 1;
}

// thêm 1 cung cho đồ thị có hướng
void addEdgeDirection(Graph *G, int x,int y){ 
    if(G->A[x][y] > 0){ //trường hợp đa cung
        G->A[x][y] += 1;
    }
    G->A[x][y] = 1;
}

void printGraph(Graph G){ // in ma trận đồ thị 
    for (int i = 1; i <= G.n; i++){
        for (int j = 1; j <= G.n; j++){
            printf("%d ",G.A[i][j]);
        }
        printf("\n");
    }
}

⚠️ LƯU Ý

Hàm thêm cung tuỳ thuộc vào hoàn cảnh bài toán mà bạn sửa lại cho đúng.

Hàm thao tác cơ bản

int inDegree(Graph G, int x){ //tính bậc trong của đồ thị
    int count = 0;
    for (int i = 1; i <= G.n; i++){
        if(G.A[x][i] == 1)
            count++;
    }
    return count;
}
int outDegree(Graph G, int x){ //tính bậc ngoài của đồ thị
    int count = 0;
    for(int i = 1; i <= G.n; i++){
        if(G.A[i][x] == 1)
            count++;
    }
    return count;
}
int maxDegree(Graph G){
    int max = inDegree(G,1); //sử dụng bậc trong hay ngoài đều được
    for(int i = 2; i <= G.n; i++){
        int x = inDegree(G,i);
        if(max < x)
            max = x;
    }
    return max;
}
bool multiEdge(Graph G){ //kiểm tra có chứa đa cung không
    for (int i = 1; i <= G.n; i++){
        for (int j = 0; j <= G.n; j++)
            if(G.A[i][j] > 1) // hoặc == 2 đều được
                return true;
    }
    return false;
}
List neighbors(Graph G, int x){ //trả về danh sách các đỉnh kề
    List L; makeNullList(&L);
    for (int i = 1; i <= G.n; i++){
        if(G.A[x][i] == 1)
            insertList(i,&L);
    }
    return L;
}
List arrayGraph(Graph G){ // trả về danh sách các đỉnh trong đồ thị
    List L; makeNullList(&L);
    for (int i = 1; i <= G.n; i++)
        insertList(i,&L);
    return L;
}
Cập nhật lúc :
Tác giả: Zenfection, Zenfection