1. 程式人生 > >C++語言實現-鄰接表

C++語言實現-鄰接表

 圖的鄰接表實現

鄰接表是圖的一種鏈式儲存結構。主要是應對於鄰接矩陣在頂點多邊少的時候,浪費空間的問題。它的方法就是宣告兩個結構。如下圖所示:

先來看看虛擬碼:

typedef char Vertextype;

//表結點結構

struct ArcNode {

    int adjvex;   //某條邊指向的那個頂點的位置(一般是陣列的下標)。

    ArcNode * nextarc; //指向下一個表結點

    int weight;   //這個只有網圖才需要使用。普通的圖可以直接忽略

}; 

//頭結點

struct Vnode

{

    Vertextype data;  //這個是記錄每個頂點的資訊(現在一般都不需要怎麼使用)

    ArcNode * firstarc; //指向第一條依附在該頂點邊的資訊(表結點)

};

1、無向圖

該無向圖中表節點下的數字1、2、3、0對應的是頭結點的下標,用此表示每個頭結點與其他的哪些節點相連

2、有向圖

該有向圖中表節點下的數字1、2、3對應的是頭結點的下標,用此表示每個頭結點與其他的哪些節點具有指向關係

有向圖的鄰接表程式碼實現:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int max_v=100;

int main()
{
    int v,e;
    int V[max_v];
    cin>>v>>e;///輸入頂點和邊的個數
    for(int i=0;i<v;i++)
    {
        cin>>V[i];///輸入頂點的值
    }
    
int x,y; vector<int> G[max_v]; //vector的用法:https://blog.csdn.net/hancunai0017/article/details/7032383
for(int i=0;i<e;i++) { cin>>x>>y; G[x].push_back(y);///節點x的下一個節點是y } for(int i=0;i<v;i++) { cout<<V[i]<<"->"; for(int j=0;j<G[V[i]].size();j++)//此處的G[V[i]].size()的含義參考另一篇關於拓撲排序的部落格 { cout<<G[V[i]][j]<<' '; } cout<<endl; } return 0; }

輸入:
5 6
0 1 2 3 4
0 1
1 3
2 1
3 0
3 2
4 3
結果顯示:
0->1
1->3
2->1
3->0 2
4->3