1. 程式人生 > >鏈式前向星寫法下的DFS和BFS

鏈式前向星寫法下的DFS和BFS

con img printf init 無向圖 while str 想是 區別

技術分享圖片

Input
5 7
1 2
2 3
3 4
1 3
4 1
1 5
4 5
output
1 5 3 4 2

#include<bits/stdc++.h>
using namespace std;

const int maxn = 150;
const int maxm = 1050;

int n, m;//頂點數,邊數
int head[maxm], tot;
bool used[maxn];
//head[u]表示已知的最後一條以u為起點的邊在邊集e中的下標

struct edge {
    int to, next;
    //e[i].to表示邊的終點,e[i].next表示上一條和邊e[i]起點相同的點在e中的下標
    //int w;權值
}e[maxm];//邊集

void init() {
    tot = 0;
    memset(head, -1, sizeof(head));
    memset(used, 0, sizeof(used));
}

void add(int u, int v) {//在圖中加邊
    //e[tot].w = w
    e[tot].to = v;
    e[tot].next = head[u];
    head[u] = tot++;
}

void dfs(int u) {
    used[u] = 1;
    printf("%d ", u);
    for (int i = head[u]; i != -1; i = e[i].next) {//遍歷的方式
        int v = e[i].to;
        if (!used[v]) dfs(v);
    }
}

int main() {
    while (scanf("%d%d", &n, &m) == 2) {
        init();
        for (int i = 1; i <= m; ++i) {
            int from, to;
            scanf("%d%d", &from, &to);
            add(from, to);
            //add(to, from)無向圖
        }
        for (int i = 1; i <= n; ++i) {
            if (!used[i] && head[i] != -1) dfs(i);
        }
        printf("\n");
    }
    return 0;
}
/*
5 7
1 2
2 3
3 4
1 3
4 1
1 5
4 5

1 5 3 4 2
*/

鏈式前向星和鄰接表的思想是一樣的,
區別就是:鄰接表是用鏈表實現的,可以動態的增加邊;
而鏈式前向星是用結構體數組實現的,是靜態的,需要一開始知道數據範圍,開好數組大小。
相比之下,鄰接表靈活,鏈式前向星好寫。

鏈式前向星寫法下的DFS和BFS