对于下图中所示的网络,利用Dijkstra算法,求节点A到其它所有节点的前向最短通路树 试利用Dijkstra算法求图中从顶点a到其他各顶点间的最短...

\u7528Dijkstra\u7b97\u6cd5\u6c42\u9644\u56fe\u4e2d\u4ece\u70b9a\u5230\u5176\u5b83\u5404\u8282\u70b9\u7684\u6700\u77ed\u8def\u5f84\uff0c\u5e76\u7528\u56fe\u793a\u8868\u793a\u7b97\u6cd5\u4e2d\u6bcf\u4e00\u6b21\u7684\u6267\u884c\u60c5\u51b5\uff5e

\u7ed3\u679c\u5982\u4e0b\u56fe\uff1a

1 c:2
2 c:2 f:6
3 c:2 f:6 e:10
4 c:2 f:6 e:10 d:11
5 c:2 f:6 e:10 d:11 g:14
6 c:2 f:6 e:10 d:11 g:14 b:15

#include<iostream>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<string>
using namespace std;
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define INFINITY 200//最大值
#define MAX_VERTEX_NUM 20//最大顶点个数
typedef char VertexType;//定义为char类型
//以下是全局变量,用于保存弗洛伊德算法的路径和长度
int D[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//记录最短路径长度
int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM];//记录最短路径标记
//以下是全局变量,用于保存迪杰斯特拉算法的路径和长度
int Distance[MAX_VERTEX_NUM];
VertexType former[MAX_VERTEX_NUM];//终点的前一个顶点
bool final[MAX_VERTEX_NUM];//记录顶点是否在V-S中
typedef struct ArcCell
{
int adj; //顶点关系类型
int weight; //该弧相关信息的指针,在此记录为权值
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM]; //顶点向量
AdjMatrix arcs; //邻接矩阵
int vexnum; //顶点数
int arcnum; //弧数
}MGraph;
void InitialMGraph(MGraph &G)//初始化
{
G.arcnum=G.vexnum=0; //初始化边数跟顶点数都为零
for(int i=0;i<MAX_VERTEX_NUM;i++)
for(int j=0;j<MAX_VERTEX_NUM;j++)
{
if(i==j)
G.arcs[i][j].weight=0;
else
G.arcs[i][j].weight=INFINITY; //初始化为200,以200认为是无穷大
}
}
void InsertVex(MGraph &G,VertexType v)//插入顶点
{
if(G.vexnum<=MAX_VERTEX_NUM)
G.vexs[G.vexnum++]=v;
}
void InsertArc(MGraph &G,VertexType v1,VertexType v2)//插入边
{
int m,n;
G.arcnum++;
for(int k=0;k<G.vexnum;k++)
{
if(G.vexs[k]==v1)
m=k;
if(G.vexs[k]==v2)
n=k;
}
//插入
ArcCell A;
cout<<"请输入权值:";
cin>>A.weight;
G.arcs[m][n].weight=A.weight;
}
//迪杰斯特拉最短路径,假设始点就存储在数组中的第一个
void ShortestPath_DIJ(MGraph G,int v0)
{
//初始化距离
for(int v=0;v<G.vexnum;++v)
{
final[v]=false;
Distance[v]=G.arcs[v0][v].weight;
if(Distance[v]<INFINITY&&Distance[v]!=0)
{
former[v]=G.vexs[v0];
}
else
former[v]='#';
}
final[v0]=true;
former[v0]=G.vexs[v0];
for(int i=1;i<G.vexnum;++i)//剩余的G.vexnum-1个顶点
{
int w;
int min=INFINITY;
int v=-1;
for(w=0;w<G.vexnum;++w)
{
if(!final[w]&&Distance[w]<min)
{
v=w;
min=Distance[w];
}
}
if(v!=-1)
{
final[v]=true;//将离顶点V0最近的顶点v加入S集合中
for(w=0;w<G.vexnum;++w)//更新当前的最短路径及距离
{
if(!final[w]&&(min+G.arcs[v][w].weight<Distance[w])&&G.arcs[v][w].weight<INFINITY)
{
Distance[w]=min+G.arcs[v][w].weight;
former[w]=G.vexs[v];
}
}
}
}
}
//输出迪杰斯特拉中的最短路径
void output_ShortestPath_DIJ(MGraph G,int v0)
{
int i;
for(i=1;i<G.vexnum;i++)
{
cout<<G.vexs[v0]<<"->"<<G.vexs[i]<<":";
if(Distance[i]!=INFINITY)
{
cout<<"最短路径长度为:"<<Distance[i]<<" 最短路径的前一个顶点为:"<<former[i];
cout<<endl;
}
else
cout<<"此两顶点之间不存在路径"<<endl;
}
}
//弗洛伊德最短路径
void shortestPath_FLOYD(MGraph G)
{
for(int v=0;v<G.vexnum;++v)
{
for(int w=0;w<G.vexnum;++w)
{
D[v][w]=G.arcs[v][w].weight;
for (int k=0;k< G.vexnum;k++)
P[v][w][k]=-1;
if(D[v][w]<INFINITY) //从v到w有直接路径
P[v][w][v]=w;
}
}
for(int k=0;k<G.vexnum;++k)
{
for(int v=0;v<G.vexnum;v++)
for(int w=0;w<G.vexnum;++w)
if(D[v][w]>D[v][k]+D[k][w])
{
D[v][w]=D[v][k]+D[k][w];
for(int i=0;i<G.vexnum;i++)
{
if(P[v][k][i]!=-1)//原来存了顶点
P[v][w][i]=P[v][k][i];
else
P[v][w][i]=P[k][w][i];
}
}
}
}
//输出弗洛伊德中的最短路径
void output_shortestPath_FLOYD(MGraph G)
{
for(int i=0;i<G.vexnum;++i)
{
for(int j=0;j<G.vexnum;++j)
{
if(i!=j)//自己不能到达自己
{
cout<<G.vexs[i]<<"->"<<G.vexs[j]<<":";
if(D[i][j]==INFINITY)
{
cout<<"此两顶点之间不存在路径"<<endl;
}
else
{
cout<<"最短路径长度为:"<<" "<<D[i][j]<<" ";
cout<<"最短路径为:";
cout<<G.vexs[i]<<" ";
for(int k=i;k!=-1;k=P[i][j][k])
{
if(k!=i)
cout<<G.vexs[k];
}
cout<<endl;
}
}
}
}
}
int main()
{
int num1;//顶点个数
int num2;//弧个数
cout<<"请输入顶点个数:";
cin>>num1;
cout<<"请输入边的个数:";
cin>>num2;
VertexType v;
MGraph G;
InitialMGraph(G);
cout<<"请输入顶点的信息(整型):";
for(int i=0;i<num1;++i)
{
cin>>v;;
InsertVex(G,v);
}
VertexType v1,v2;
for(int j=0;j<num2;++j)
{
cout<<"请输入两个结点数据来表示的边:";
cin>>v1>>v2;
InsertArc(G,v1,v2);
}
ShortestPath_DIJ(G,0);
cout<<"迪杰斯特拉中的最短路径如下:"<<endl;
output_ShortestPath_DIJ(G,0);
shortestPath_FLOYD(G);
cout<<"它中的最短路径如下:"<<endl;
output_shortestPath_FLOYD(G);
return 0;
}

  • 鍦ㄦ棤绾胯矾鐢卞櫒涓缃棤绾缃戠粶瀵嗙爜
    绛旓細浣跨敤鏃犵嚎璺敱鍣ㄧ粍寤烘棤绾垮眬鍩熺綉鍚庯紝榛樿鎯呭喌涓嬫湁鏁堣寖鍥村唴鐨勬棤绾跨綉缁滅敤鎴烽兘鍙互杩炴帴鍒版棤绾缃戠粶涓紝鐢ㄦ埛鍙互閫氳繃鍦ㄦ棤绾胯矾鐢卞櫒涓缃棤绾跨綉缁滃瘑鐮侀檺鍒舵棤绾跨敤鎴疯繛鎺ュ埌鏃犵嚎缃戠粶銆備互D-Lin鐨凞I-624+A涓轰緥锛岃缃棤绾跨綉缁滃瘑鐮佺殑姝ラ濡備笅鎵杩帮細姝ラ/鏂规硶 鐧诲綍鏃犵嚎璺敱鍣ㄧ鐞嗙晫闈紝鍦ㄢ滈椤碘濋夐」鍗′腑鍗曞嚮宸︾獥鏍涓殑鈥...
  • 浠涔堟槸UPnP 濡備綍鎿嶄綔UPnP銆愭搷浣滄柟娉曘-鎼滅嫍杈撳叆娉
    绛旓細浠I-504涓轰緥鏉ヨ缃甎PnP銆(1) 鍦ㄨ绠楁満涓婂紑鍚疷PnP銆傝绠楁満鎺у埗闈㈡澘→娣诲姞鎴栧垹闄ょ▼搴 鐐瑰嚮“娣诲姞/鍒犻櫎windows缁勪欢”→缃戠粶鏈嶅姟→璇︾粏淇℃伅 閫変腑鍥句腑鎵绀閫夐」锛岀偣鍑荤‘瀹氥(2) 鍦ㄨ矾鐢卞櫒涓婂紑鍚疷PnP銆傚湪DI-504姝ょ晫闈㈠彲寮鍚疷PnP銆(3) 鍦ㄧ綉涓婇偦灞呮煡鐪婾PnP銆傜偣鍑籇I-504鍥炬爣鍗冲彲瀵笵I-...
  • 鐢佃矾瀹為獙:浜岀鍙缃戠粶鍙傛暟鐨勬祴瀹氫腑鍙屽彛缃戠粶鍚屾椂娴嬮噺鍜屽垎鍒祴閲忕殑娴嬮噺姝ラ...
    绛旓細U1=AU2+BI2 I1=CU2+DI2 寮涓殑A銆丅銆丆銆丏涓哄弻鍙缃戠粶鐨勪紶杈撳弬鏁帮紝鍏跺煎畬鍏ㄤ簬缃戠粶鐨勬嫇鎵戠粨鏋勫強鍚勬敮璺厓浠剁殑鍙傛暟鍊硷紝杩欏洓涓弬鏁拌〃寰佷簡璇ュ弻鍙g綉缁滅殑鍩烘湰鐗规э紝浠栦滑鐨勫惈涔夋槸锛欰=U10/U20 锛堜护I2=0, 鍗宠緭鍑哄彛寮璺椂锛塀=U1S/I2S (浠2=0,鍗宠緭鍑哄彛鐭矾鏃)C=I10/U20 (浠2=0,鍗宠緭鍑...
  • 鏍规嵁濡備笅鐨勫弻浠e彿缃戠粶鍥,璁$畻鍙屼唬鍙缃戠粶鍥句腑鍏釜鍏抽敭鐨勬椂闂村弬鏁,骞剁‘瀹...
    绛旓細褰鍒╃敤鍏抽敭鑺傜偣鍒ゆ柇鍏抽敭绾胯矾鏃,杩樺簲璇ユ弧瓒充笅鍒楀垽鍒紡: ETi+Di-j=Etj 鈶 鎵╁睍璧勬枡: (1)涓嶅厑璁稿嚭鐜颁唬鍙风浉鍚岀殑绠嚎: 涓椤瑰伐浣滃簲鍙湁鍞竴鐨勪竴鏉$绾垮拰鐩稿簲鐨勪竴瀵鑺傜偣缂栧彿,绠熬鐨勮妭鐐圭紪鍙峰簲灏忎簬绠ご鐨勮妭鐐圭紪鍙枫 (2)鍙屼唬鍙缃戠粶鍥句腑涓嶅厑璁稿嚭鐜颁竴涓互涓婄殑璧峰鑺傜偣鎴栫粓鐐硅妭鐐广 (3)鍦ㄧ綉缁滃浘涓弗绂佸嚭鐜板惊鐜洖璺 (...
  • 椤圭洰璁″垝绱у墠宸ヤ綔銆佺揣鍚庡伐浣滄槸浠涔堟剰鎬?Di-j鎸囩殑鏄竴椤瑰伐浣滃畬鎴愭椂闂...
    绛旓細绱у悗宸ヤ綔鏄缃戠粶鍥句腑绱ц窡鐫鏌愰」宸ヤ綔鑰屽紑灞曠殑宸ヤ綔銆傚宸ヤ綔B銆丆鍦ㄥ伐浣淎瀹屾垚鍚庣揣璺熺潃寮濮嬭繘琛岋紝鍒橞銆丆宸ヤ綔鍗矨宸ヤ綔鐨勭揣鍚庡伐浣溿傚畠琛ㄧず鏂藉伐涓竴瀹氳閬靛畧鐨勬柦宸ラ『搴忥紝鍦ㄧ粯鍒剁綉缁滃浘鍓嶈姝g‘鐞嗚В锛屽惁鍒欐槗浜х敓閿欒銆Di-j鏄寚鐨勪竴椤瑰伐浣滃畬鎴愭椂闂达紝杩欎釜琛ㄧず鏂规硶鍦ㄥ弻浠e彿缃戣矾鍥鹃噷闈㈡湁鐨勶紝i鍜宩閮芥槸琛ㄧず涓椤瑰伐浣滅殑...
  • 鍦ㄥ弻浠e彿缃戠粶鍥句腑鎬庢牱鏍规嵁鏃堕棿鍙傛暟纭畾鍏抽敭宸ヤ綔鍜屽叧閿嚎璺?
    绛旓細褰鍒╃敤鍏抽敭鑺傜偣鍒ゆ柇鍏抽敭绾胯矾鏃讹紝杩樺簲璇ユ弧瓒充笅鍒楀垽鍒紡锛 ETi+Di-j=Etj 鈶 鍙屼唬鍙风綉缁滃浘锛氬弻浠e彿缃戠粶璁″垝鍙堢О绠嚎寮缃戠粶鍥撅紝瀹冩槸浠ョ绾垮強鍏朵袱绔妭鐐圭殑缂栧彿琛ㄧず宸ヤ綔锛屾牴鎹伐浣滃叾鍏堝悗椤哄簭鍜岀浉浜掑叧绯绘墍琛ㄧず鐨勬湁鍚戙佹湁搴忕殑缃戠姸鍥惧舰銆傚畠鏄缓璁惧伐绋嬭繘搴﹁鍒掔殑甯哥敤琛ㄧず鏂规硶涔嬩竴銆傚湪鍙屼唬鍙缃戠粶鍥句腑鍏锋湁涓変釜鍩烘湰...
  • 璇烽棶浠涔堟槸UPnP 濡備綍鎿嶄綔UPnP銆愭搷浣滄柟娉曘
    绛旓細浠I-504涓轰緥鏉ヨ缃甎PnP銆(1) 鍦ㄨ绠楁満涓婂紑鍚疷PnP銆傝绠楁満鎺у埗闈㈡澘→娣诲姞鎴栧垹闄ょ▼搴 鐐瑰嚮“娣诲姞/鍒犻櫎windows缁勪欢”→缃戠粶鏈嶅姟→璇︾粏淇℃伅 閫変腑鍥句腑鎵绀閫夐」锛岀偣鍑荤‘瀹氥(2) 鍦ㄨ矾鐢卞櫒涓婂紑鍚疷PnP銆傚湪DI-504姝ょ晫闈㈠彲寮鍚疷PnP銆(3) 鍦ㄧ綉涓婇偦灞呮煡鐪婾PnP銆傜偣鍑籇I-504鍥炬爣鍗冲彲瀵笵I-...
  • 璁$畻鏈缃戠粶鐨勭畝绛旈棶棰!~甯屾湜鎳傜綉缁滅殑鑰佸笀浠潵绠绛斾竴涓嬨
    绛旓細1.鏁版嵁閫氫俊绯荤粺鎴栬绠楁満缃戠粶绯荤粺涓,浼犺緭濯掍綋鐨勫甫瀹芥垨瀹归噺寰寰浼氳秴杩囦紶杈撳崟涓淇″彿鐨勯渶姹,涓轰簡鏈夋晥鍦鍒╃敤閫氫俊绾胯矾,甯屾湜涓涓俊閬撳悓鏃朵紶杈撳璺俊鍙,杩欏氨鏄墍璋撶殑澶氳矾澶嶇敤鎶鏈.閲囩敤澶氳矾澶嶇敤鎶鏈兘鎶婂涓俊鍙风粍鍚堣捣鏉ュ湪涓鏉$墿鐞嗕俊閬撲笂杩涜浼犺緭,鍦ㄨ繙璺濈浼犺緭鏃跺彲澶уぇ鑺傜渷鐢电紗鐨勫畨瑁呭拰缁存姢璐圭敤 鍒嗕负棰戝垎澶氳矾澶嶇敤FDM (Frequency Div...
  • 缃戠粶闂
    绛旓細Cisco PIX 501闃茬伀澧欓噰鐢ㄤ簡鎬濈鏈鏂扮殑鑷傚簲瀹夊叏绠楁硶(ASA)鍜孭IX鎿嶄綔绯荤粺,鍒╃敤寮哄ぇ鐨勭姸鎬佺洃娴嬫妧鏈,鍙互...涓嬪浘鏄30鑺傜偣缃戠粶鎷撴墤缁撴瀯鍥,鎴戜滑鍙傜収涓嬪浘灏卞彲浠ョ粍寤轰竴涓30鑺傜偣鐨勫姙鍏綉缁溿 褰撶劧,杩欎粎浠呮槸浠庣‖浠朵笂...杩橀渶瑕佸湪杞欢閰嶇疆涓婁笅宸ュか,鍦ㄨ繖涓缃戠粶涓,鎴戜滑涓昏瀵璺敱鍣ㄨ繘琛岃缃,鑷充簬濡備綍璁剧疆,澶у鍙互鍙傝冭矾鐢卞櫒鐨...
  • 鏃犵嚎璺敱鍣ㄦ庝箞鐢,鎴戠敤鐨勬槸DI-524,鎴戞病鐢ㄨ鏄庝功,璇蜂綘璇寸殑闈炲父闈炲父閮借缁...
    绛旓細浠庤繖涓晫闈㈠彲浠ョ湅鍒,鎮ㄨ兘澶熼氳繃涓ょ鏂规硶瀵璺敱鍣ㄨ繘琛缃戠粶杩炴帴鐨勮缃:涓鏄娇鐢ㄩ厤缃悜瀵,浜屾槸浣跨敤鎵嬪姩閰嶇疆銆傚鏋滄偍鍙渶瑕佽繘琛學AN绔彛閰嶇疆,閭d箞浣跨敤璁剧疆鍚戝鍗冲彲銆備笅闈㈤拡瀵归厤缃悜瀵肩殑浣跨敤杩涜璇存槑銆 浣跨敤閰嶇疆鍚戝杩涜璁剧疆 鍦ㄤ笂鍥炬墍绀虹殑鐣岄潰涓偣鍑烩滈厤缃悜瀵尖,杩涘叆缃戠粶杩炴帴鍚戝绐楀彛銆 鐐瑰嚮缃戠粶杩炴帴鍚戝鍚庢樉绀虹綉缁滆繛鎺ヨ缃殑姝ラ...
  • 扩展阅读:人工智能找数字规律软件 ... 如何看图纸基本知识 ... 找规律推算app ... 数字规律生成器 ... 图标大全 ... 下图网络用语 ... 分歧转一致 图解 ... 注意标识 ... 数字分析推算软件 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网