鏈式前向星

鏈式前向星

[外鏈圖片轉存失敗(img-0ZtAaOKX-1566637663940)(C:\Users\紅豆\AppData\Roaming\Typora\typora-user-images\1565857722159.png)]

鏈式前向星是鄰接矩陣的一種。

如何用鏈式前向星來存圖?

將上圖存存完後應該是這個樣子…

[外鏈圖片轉存失敗(img-cSQxmDGc-1566637663941)(C:\Users\紅豆\AppData\Roaming\Typora\typora-user-images\1565858049997.png)]

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;
}

打印的結果和預期一樣

[外鏈圖片轉存失敗(img-14lbcX6O-1566637663944)(C:\Users\紅豆\AppData\Roaming\Typora\typora-user-images\1565858804101.png)]

當加入第一條邊時 , P[1] = 0

[外鏈圖片轉存失敗(img-1rHqWBRS-1566637663945)(C:\Users\紅豆\AppData\Roaming\Typora\typora-user-images\1565858880550.png)]

當加入第二條邊時

[外鏈圖片轉存失敗(img-0p4CB11g-1566637663946)(C:\Users\紅豆\AppData\Roaming\Typora\typora-user-images\1565858948909.png)]

此時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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章