C++圖論算法——圖的儲存方式


使用二維數組鄰接矩陣儲存圖

無向圖:

圖G

定義圖G[101][101],G[i][j]的值表示從結點vi到vj是否有邊或弧,若有,取值為1或權值,若無,則取值為0或∞。以下是圖G用鄰接矩陣表示的列表:

 

結點 A B C D
A 0 1 1 1
B 1 0 0 1
C 1 0 0 1
D 1 1 1 0

有向圖:

圖G(無權值)圖G(有權值)

定義圖G[101][101],G[i][j]的值表示從結點vi到vj是否有邊或弧,若有,取值為1或權值,若無,則取值為0或∞。以下是圖G用鄰接矩陣表示的列表:

結點 A B C D
A 1 1
B
C 1
D 1
結點 A B C D
A 10 3
B
C 6
D 5
#include <iostream>
#include <cstring>
using namespace std;

double G[101][101];
int main(){
    int u,v,t,n,m;                        // 結點u到結點v的節點值為t
    cin >> n;
    for (int i = 1;i <= n;i++){
        for (int j = 1;j <= n;j++){
            G[i][j] = 0x7fffffff;        // 初始化為無窮大 
        }
    }
    // 或者使用memset(G,0x7fffffff,sizeof(G))來初始化
    /*
    若是int類型數組,則采用memset(G,0x7f,sizeof(G)))
    0x7fffffff表示無窮大,若是無向圖,那么要寫成memset(G,0,sizeof(G))
    也可以定義成memset(G,oxaf,sizeof(G)),全都定義成很小的數。 
    */
    cin >> m;
    for (int i = 1;i <= m;i++){
        cin >> u >> v >> t;
        G[u][v] = t;G[v][u] = t;        // 鄰接矩陣的值 
    }
    // 輸出
    for (int i = 1;i <= n;i++){
        for (int j = 1;j <= n;j++){
            cout << G[i][j] << " ";
        }
        cout << endl;
    } 
    return 0;
}

這是定義鄰接矩陣的代碼,大家可以根據需要查看注釋修改代碼。

數組模擬鄰接表存儲圖

圖的鄰接表存儲,又叫做鏈式存儲法。本應該使用鏈表來實現,但現實中,大部分的情況下只需要用數組模擬即可。下面是示例代碼:

#include <iostream>
using namespace std;

const int maxn = 10001;
int head[maxn],num,n,m,u,v,t;
struct G{                            // 結構體圖G 
    int next,to,dis;
}g[maxn];
void add(int u,int v,int t){        // 添加從結點u到v權值為t的單向邊 
    g[++num].next = head[u];
    g[num].to = v;
    g[num].dis = t;
    head[u] = num;
}

int main(){
    num = 0;
    cin >> n >> m;                    // 輸入 
    for (int i = 1;i <= m;i++){
        cin >> u >> v >> t;            // 結點u到結點v的權值為t 
        add(u,v,t);
    }
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM