簡體   English   中英

圖中的鄰接表

[英]Adjacency List in graph

您好我正在嘗試使用以下代碼使用鄰接列表來實現圖形。

#include<iostream>
#include<list>
#include<vector>
#include<unordered_map>
using namespace std;

class graph{
    public:
    vector<int> adj[10000];

void insert(int u,int v, bool direction) {
    adj[u].push_back(v);

    if(direction==1) {
        adj[v].push_back(u);
    }

}

void print(int n) {


       for(int i=0;i<n+1;i++) {
            cout<<i<<"->";
            for(auto j : adj[i]) {
                cout<<j<<",";
        }
        cout<<endl;
        }
    }
    
};
int main( ) {
    
    int n;
    cout<<"Enter no of node"<<endl;
    cin>>n;
cout<<"enter edges "<<endl;
int m;
cin>>m;
graph g;
for(int i=0;i<m;i++) {
    int u, v;
    cin>>u>>v;
    g.insert(u,v,1);
}
g.print(n);
return 0;

}

但是這段代碼的問題是,它只會在我的節點以連續方式(0、1、2、3)從 0 開始的情況下給出正確的答案。 但是當我嘗試打印此圖的鄰接列表時:

在此處輸入圖像描述

然后給出這個 output:

在此處輸入圖像描述

有人能告訴我我哪里錯了嗎?

您添加的邊與 i 圖片不同,您輸入的是 edge 1, 3而不是 edge 1, 5

它正在打印0 ,因為您從i = 0開始了 for 循環,並且出於同樣的原因它不打印節點5 (循環在4結束,因為您將擁有i < 4 + 1

void print(int n) {
             //↓↓↓ HERE
       for(int i=0;i<n+1;i++) {
            cout<<i<<"->";
            for(auto j : adj[i]) {
                cout<<j<<",";
        }
        cout<<endl;
        }
    }

以下是我將如何更改您的代碼:首先,我稍微更改了print() function (添加了if()以查看當前行是否為空,並且我將int n參數更改為int maximum ,它將保持最大值節點,所以我們知道什么時候停止for )。

void print(int maximum)
    {
        for(int i=0; i<=maximum; i++)
        {
            if(!adj[i].empty())
            {
                cout<<i<<"->";

                for(auto j : adj[i])
                {
                    cout<<j<<",";
                }
                cout<<endl;
            }
        }
    }

然后,在main()中,我添加了maximumaux變量以存儲上述最高值節點。 而且我還將g.print(n)更改為g.print(maximum)

int main( )
{

    int n, maximum = 0, aux;
    cout<<"Enter no of node"<<endl;
    cin>>n;
    cout<<"enter edges "<<endl;
    int m;
    cin>>m;
    graph g;
    for(int i=0; i<m; i++)
    {
        int u, v;
        cin>>u>>v;
        g.insert(u,v,1);

        aux = max(u, v);
        maximum = max(maximum, aux);
    }
    g.print(maximum);
    return 0;
}

但是,我可能不是 Terry A. Davis,但我知道如果你說你有 4 個節點,那 4 個節點將是 1 2 3 和 4。而且我也知道任何與圖相關的問題都會有從 1 開始的節點,因此每個for loop都將從i = 1開始,或者至少我是這樣教的。 你這樣做的方式也可能是正確的,但我不確定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM