[英]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()
中,我添加了maximum
和aux
變量以存儲上述最高值節點。 而且我還將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.