1. 程式人生 > 其它 >圖的遍歷筆記3

圖的遍歷筆記3

技術標籤:演算法演算法

圖的遍歷


在社交網路中,不能單純的用0,1來表示兩個人是否為朋友,當兩個人是朋友時,有可能是很好的朋友,也可能是一般的朋友,還有可能是不熟悉的朋友
我們用一個數值來表示兩個人之間的朋友關係強弱,兩個人的朋友關係越強,對應的值就越大,而這個值就是兩人在圖中對應的邊的權值,簡稱邊權,對應的圖我們稱之為帶權圖

在這裡插入圖片描述
鄰接矩陣儲存
用鄰接矩陣儲存帶權圖和之前的方法一樣,用G[a][b]來表示a和b之間的邊權(我們需要用一個數值來表示邊的不存在,如0)。同樣,這個矩陣依然是對稱的
鄰接表儲存
用鄰接表儲存帶權圖和之前的實現方式略有不同,我們需要用一個結構體來記錄一條邊連線的點和這個邊的邊權,然後用一個vector來儲存若干個結構體

結構體的定義舉例如下:

struct node
{
	int v;//用來記錄連線的點
	int len;//用來記錄這條邊的邊權
};

我們通常把向圖中加入一條邊寫成一個函式,例如加入一條有向邊(u,v),邊權為w,就可以用如下的函式來實現(我們需要把圖定義成全域性變數).

vector<node>G[110];
void insert1(int u, int v, int w)
{
	node temp;
	temp.v = v;
	temp.len = w;
	G[u].push_back(temp);
}

而插入一條無向邊,實際上相當於插入兩條方向相反的有向邊

void insert2
(int u, int v, int w) { insert1(u, v, w); insert1(v, u, w); }

帶權圖鄰接表的實現
首先我們定義好用於存圖的結構體,結構體裡面有兩個變數,分別記錄連線的點和邊權
同時,定義好儲存圖的vector

#include <iostream>
#include <cstring>
#include<vector>
using namespace std;
struct node
{
	int v, w;
};
vector<node>G[11];
void insert1(int u, int
v, int w) { node temp; temp.v = v; temp.w = w; G[u].push_back(temp); } void insert2(int u, int v, int w) { insert1(u, v, w); insert1(v, u, w); } void input() { int m; cin >> m; for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; insert2(u, v ,w); } } void output() { for (int i = 1; i <= 10; i++) { for (int j = 0; j < G[i].size(); j++) { cout << "(" << i << ", " << G[i][j].v << ", " << G[i][j].w << ")" << endl; } } } int main() { input(); output(); return 0; }