1. 程式人生 > >深度優先搜尋(鄰接表)

深度優先搜尋(鄰接表)

#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

struct Node
{
    //v 代表編號
    //w 代表權值
    int v,w;
    Node(int _v,int _w):v(_v),w(_w){}
};
//圖的儲存結構
vector<Node> imap[10005];
bool vis[10005] = {false};//初始情況各個頂點都沒有被訪問
int n;//頂點數目
//u 當前頂點的標號 depth為深度
void DFS(int u,int depth){

    vis[u] = true;//設定u已經被訪問

    // 遍歷imap[i]
    for(int i = 0;i < imap[u].size();i++){

        Node iv = imap[u][i];

        if(vis[iv.v] == false){
            printf(" -> %d",iv.v);
            DFS(iv.v,depth + 1);//訪問iv.v
        }
    }
}
void DFSTrave() {
    //for針對連通分量
    for(int i = 0;i < n;i++){
        if(vis[i] == false)
            DFS(i,1);
    }
}
int main(int argc, char const *argv[]) {

    printf("please input the vectex number:");
    scanf("%d",&n);
    //先輸入v再輸入w 輸入w = -1代表i的鄰接表輸入結束,如果v & w = -1說明輸入結束
    for(int i = 0;i < n;i++) {
        int iv,iw;

        while (1) {
            scanf("%d%d",&iv,&iw);
            //當w = -1時i的鄰接表輸入結束
            if(iw == -1)break;

            imap[i].push_back(Node(iv,iw));
        }
    }
    // for(int i = 0;i < imap.size();i++){
    //     for(int j = 0;j < imap[i].size();j++){
    //         printf("%d %d | ",imap[i][j].v,imap[i][j].w);
    //     }
    //     printf("\n");
    // }
    printf("DFS:\n");
    printf("0");
    DFSTrave();
    printf("\n");
    return 0;
}

雖然構建鄰接表時加入了權值但是程式碼中並沒有實際應用

輸入對應的圖