最近,同期的一位大佬給我出了一道題目,改編自 洛谷 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就可以實現鄰接表了。
是不是比鏈式前向星更加簡潔呢?
