深度優先搜尋(鄰接表)
阿新 • • 發佈:2018-11-08
#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; }
雖然構建鄰接表時加入了權值但是程式碼中並沒有實際應用
輸入對應的圖