圖的遍歷筆記3
阿新 • • 發佈:2021-02-10
圖的遍歷
在社交網路中,不能單純的用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;
}