鏈式前向星
鏈式前向星是鄰接矩陣的一種。
如何用鏈式前向星來存圖?
將上圖存存完後應該是這個樣子…
v表示頂點,len表示長度,eid 代表這條邊的編號,next表示指向下一條邊的編號
左邊數組P[u]表示,以u 爲起點 所指的第一條的邊的編號
比如1號點和2號點之間有一條邊長度爲10,還和3號點有一條邊長度爲5
所以點集可以用數組表示,邊集可以用結構體表示
const int max_n = 100;
const int max_m = 10000;
struct node{
int v,len;
int next;
}E[max_m];
int p[max_n],eid;
next 是指向下一條邊的編號。
構圖之前要初始化,頂點之間開始沒有邊,記爲-1,每進入一條邊用頭插的方式。
編號一開始初始化爲0。
void init()
{
memset(p,-1,sizeof(p));
eid=0;
}
用頭插的方式加邊
怎麼給每條邊編號呢?eid代表編號,初始化爲0,每當加入一條邊的時候eid++.
void insert(int u,int v,int len)
{
E[eid].v = v;
E[eid].len = len;
E[eid].next = p[u];
p[u] = eid++;
}
很明顯可以根據每個點,遍歷它所有的邊,當next爲-1時,說明遍歷完全
int main()
{
init();
insert(1,2,10);
insert(1,3,5);
insert(2,3,1);
insert(3,5,10);
insert(3,4,6);
insert(5,4,11);
for(int u=1;u<=5;++u)
{
cout<<u<<": ";
for(int i = p[u];i+1;i = E[i].next)
{
cout<<E[i].v<<" "<<E[i].len<<" "<<i<<" ->";
}
cout<<endl;
}
return 0;
}
打印的結果和預期一樣
當加入第一條邊時 , P[1] = 0
當加入第二條邊時
此時p[1] 值爲1 E[eid].next值爲0
然後整個過程都很好理解
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int max_n = 100;
const int max_m = 10000;
struct node{
int v,len;
int next;
}E[max_m];
int p[max_n],eid;
void init()
{
memset(p,-1,sizeof(p));
eid=0;
}
void insert(int u,int v,int len)
{
E[eid].v = v;
E[eid].len = len;
E[eid].next = p[u];
p[u] = eid++;
}
int main()
{
init();
insert(1,2,10);
insert(1,3,5);
insert(2,3,1);
insert(3,5,10);
insert(3,4,6);
insert(5,4,11);
for(int u=1;u<=5;++u)
{
cout<<u<<": ";
for(int i = p[u];i+1;i = E[i].next)
{
cout<<E[i].v<<" "<<E[i].len<<" "<<i<<" ->";
}
cout<<endl;
}
cout << p[1]<<endl;
cout << E[1].next<<endl;
return 0;
}