STL中vector怎么實現鄰接表


最近,同期的一位大佬給我出了一道題目,改編自 洛谷 P2783 有機化學之神偶爾會做作弊

這道題好坑啊,普通鏈表過不了,只能用vector來存邊。可能更快一些吧?

所以,我想記錄並分享一下vector怎么實現鄰接表。

 

I:存邊

通常我們用的鏈表結構需要自己打一個add函數

int cnt,head[maxn];

struct edge {
    int next,to,cost;
} e[maxn];

void add(int a,int b,int c)
{
    e[++cnt].to=b;e[cnt].cost=c;
    e[cnt].next=head[a];head[a]=cnt;
} 

但是,vector來存儲就不需要這么復雜。我們還是要一個結構體,但是不需要用e.next和head[]數組。

然后,我們要明確vector數組的下標是什么。請看代碼中詳解。

struct edge {
    int to,cost;
};

vector <edge> e[maxn];//表示以i為起點的所有邊
//p.s. 此時定義的看似是一維數組,實際上是有兩個維度
//例如 e[x][i].to 表示的是以x為起點,第i條邊的to。

//而 存邊就是這樣 在main函數里直接:
int t;edge f;
scanf("%d%d%d",&t,&f.to,&f.cost);
e[t].push_back(f);

 

II:遍歷

遍歷十分簡單,直接一遍循環,找e[x]這個數組里面的所有邊。

這里我們要用到一個函數 e[x].size() 表示數組大小。

//假設遍歷到了x點
for (int i=0;i<s[x].size();i++) {
    int from=s[x][i].to;//這是與x點相連的i邊的to
    int w=s[x][i].cost;//同理 這是cost
}

 

就這樣 vector就可以實現鄰接表了。

是不是比鏈式前向星更加簡潔呢?

 


免責聲明!

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



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