一個(gè)人做網(wǎng)站難嗎seo優(yōu)化標(biāo)題
圖論是數(shù)學(xué)的一個(gè)分支,起源于18世紀(jì)。1736年,數(shù)學(xué)家歐拉通過(guò)解決“哥尼斯堡七橋問(wèn)題”,將問(wèn)題抽象成點(diǎn)和線(xiàn)的關(guān)系,并通過(guò)理論分析得出結(jié)論,這個(gè)過(guò)程標(biāo)志著圖論的產(chǎn)生,歐拉也因此被稱(chēng)為“圖論之父”。圖論研究的是由若干給定的點(diǎn)及連接兩點(diǎn)的線(xiàn)所構(gòu)成的圖形,這種圖形通常用來(lái)描述某些事物之間的某種特定關(guān)系,其中點(diǎn)代表事物,連接兩點(diǎn)的線(xiàn)表示相應(yīng)兩個(gè)事物間具有這種關(guān)系。
一、無(wú)向圖和有向圖在圖論中都是重要的概念,它們之間存在顯著的區(qū)別。
首先,從定義上來(lái)看,無(wú)向圖是一種由節(jié)點(diǎn)和邊組成的數(shù)據(jù)結(jié)構(gòu),邊沒(méi)有方向性,也就是說(shuō),如果存在一條邊(u, v),那么從u到v和從v到u都是可以的。這種圖通常用來(lái)表示雙向關(guān)系,如社交網(wǎng)絡(luò)中的友誼關(guān)系。而有向圖則是一種具有方向性的圖,由一組頂點(diǎn)和一組有方向的邊組成,每條方向的邊都連著一對(duì)有序的頂點(diǎn)。在有向圖中,如果存在一條邊(u, v),那么只能從u到v,但不一定能從v到u。
此外,從應(yīng)用角度來(lái)看,無(wú)向圖主要用于表示雙向關(guān)系,如社交網(wǎng)絡(luò)、傳輸網(wǎng)絡(luò)等,以及用于搜索最短路徑等問(wèn)題。而有向圖則更多地用于表示具有方向性的關(guān)系,如流程、路徑規(guī)劃等。
二、在圖論中,最短路徑問(wèn)題是一個(gè)經(jīng)典問(wèn)題,它涉及從圖中某一頂點(diǎn)(源點(diǎn))出發(fā),到達(dá)另一頂點(diǎn)(終點(diǎn))的所有路徑中,尋找各邊權(quán)值之和最小的路徑,這種路徑稱(chēng)為最短路徑。
最短路徑問(wèn)題可以分為兩類(lèi):單源最短路徑問(wèn)題和多源最短路徑問(wèn)題。單源最短路徑問(wèn)題是求單個(gè)頂點(diǎn)和其他所有頂點(diǎn)的最短路徑,而多源最短路徑問(wèn)題則是求所有頂點(diǎn)相互之間的最短路徑。對(duì)于最短路徑問(wèn)題,有多種算法可以用來(lái)求解,包括但不限于:
- Dijkstra算法:這是最短路徑算法中最常用的一種。它基于貪心策略,通過(guò)逐步擴(kuò)展路徑來(lái)求解最短路徑。算法的基本思想是,從一個(gè)起始頂點(diǎn)開(kāi)始,逐步擴(kuò)展到其他頂點(diǎn),每次選擇當(dāng)前路徑中距離起始頂點(diǎn)最近的頂點(diǎn)進(jìn)行擴(kuò)展,直到擴(kuò)展到目標(biāo)頂點(diǎn)或者所有頂點(diǎn)都被擴(kuò)展完畢。
- Bellman-Ford算法:這也是另一種常用的最短路徑算法。
- Floyd-Warshall算法:這是一種多源最短路徑算法,可以求解圖中任意兩個(gè)頂點(diǎn)之間的最短路徑。
以下面問(wèn)題為例解決問(wèn)題:
?
clear;clc;
% 注意Matlab中的圖節(jié)點(diǎn)要從1開(kāi)始編號(hào)
s = {'v1','v1','v1','v2','v3','v3','v4','v5','v5','v5','v5','v6','v6','v7','v9','v9'};
t = {'v2','v3','v4','v5','v2','v4','v6','v4','v6','v7','v8','v5','v7','v8','v5','v8'};
weight = [6,3,1,1,2,2,10,6,4,3,6,10,2,4,2,3];
%要做出有向圖,只需要將graph改為digraph就行了
G= digraph(s,t,weight);%有向圖
myplot = plot(G,'EdgeLabel',G.Edges.Weight,'LineWidth',2);%圖賦給一個(gè)變量
set(gca,'XTick',[],'YTick',[]);
%[p,d] = shortestpath(G,start,end,[‘Method’,algorithm])
% 功能:返回圖G中start節(jié)點(diǎn)到end節(jié)點(diǎn)的最短路徑%輸入?yún)?shù):
% (1)G- 輸入圖 (graph 對(duì)象|digraph 對(duì)象)
% (2) start 起始的節(jié)點(diǎn)%
% (3) end 目標(biāo)的節(jié)點(diǎn)
% (4)[‘Method’,algorithm]是可選的參數(shù),表示計(jì)算最短路徑的算法。一般我% 們不用手動(dòng)設(shè)置,默認(rèn)使用的是“auto”,具體可設(shè)置的參數(shù)見(jiàn)下一頁(yè)課件。% 輸出參數(shù):
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% (1)P - 最短路徑經(jīng)過(guò)的節(jié)點(diǎn)
% (2)d - 最短距離
[P,d] = shortestpath(G,'v1','v8')%求v1到v8的最短路徑和距離
%在圖中高亮出最短路徑
highlight(myplot,P,'EdgeColor','red')
%任意兩點(diǎn)的最短路徑矩陣
D = distances(G)
D(1,8)%v1到v8的最短路徑
下面是代碼floyd算法的MATLAB實(shí)現(xiàn):
gg = [0,inf,-2,inf;inf,0,inf,-1; inf,2,0,inf;4,inf,3,0;];
[dist,path] = my_floyd(gg)
function [dist,path] = my_floyd(D)
[r,~]= size(D);
dist = D;
% 下面我們來(lái)初始化path矩陣
path = zeros(r);
for j= 1:rpath(:,j) = j; %將第j列的元素變?yōu)閖
end
for i = 1:rpath(i,i) = -1;%將主對(duì)角線(xiàn)元素變?yōu)?1
end
for k=1:r%以k為中轉(zhuǎn)for i=1:r %鄰接矩陣第i行for j=1:r%鄰接矩陣第j列if dist(i,j)>dist(i,k)+dist(k,j)dist(i,j)=dist(i,k)+dist(k,j);path(i,j)=path(i,k);% 起點(diǎn)為i,終點(diǎn)為j的兩個(gè)節(jié)點(diǎn)之間的最短路徑要經(jīng)過(guò)的節(jié)點(diǎn)更新為path(i,k)% 注意,上面一行語(yǔ)句不能寫(xiě)成path(i,j) = k;endendend
end
end
?總的來(lái)說(shuō),圖論是一門(mén)研究圖與網(wǎng)絡(luò)的理論學(xué)科,它在各個(gè)領(lǐng)域都發(fā)揮著重要的作用,為解決實(shí)際問(wèn)題提供了有力的工具和方法。?