正费用网络算法
正费用网络算法
首先说明图中含有向负圈的是NP问题。在本文中我们研究是正费用网络,所谓正费用网络,就是说边上的权重都是正的。下面介绍解决此类问题的一种算法,也就是Dijkstra算法。
算法描述:
设变量ui是从起点到i结点的最短距离的上限,pre(i)是达到ui时候的前一个结点。
ui和pre(i)在算法中是在变化的。设1号结点是出发顶点。则正费用网络G={V,A,W}的最短路径
(截图时候忘记去了下划线了,在这里标注一下,下面分别列出来有下划线的符号(1)i,Uj(2)Uj,pre(j)(3)Uj,Ui,Uj,wji,wji,Ui,Uj,wji,pre(i))
// try.cpp : Defines the entry point for the console application. // /************************************************************************/ /* 本算法针对的是有向图,无向图类似,不在赘述 */ /************************************************************************/ #include "stdafx.h" #include "string.h" #define FOR(n) for (int i=1;i<=n;i++) #define INFINITY 100000 //最短路径算法 int U[100]; int Pre[100]; bool Flag[100];//表示结点是否被加入到S集合中 int Edge[100][100];//记录边的信息 void Edge_init(){ Edge[1][2]=6; Edge[1][3]=4; Edge[2][3]=2; Edge[2][4]=2; Edge[3][4]=1; Edge[3][5]=2; Edge[5][6]=3; Edge[5][4]=1; Edge[4][6]=7; } void init(int n){ for (int j=1;j<=n;j++)// { Flag[j]=false; } Pre[1]=0; for (int p=1;p<=n;p++) { U[p]=INFINITY; } U[1]=0;//ui初始化 for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) { Edge[i][j]=INFINITY; } Edge_init(); } int SearchNode(int n){//寻找最短的Ui int index;//最短Ui的下表 int min=INFINITY; while (n!=0) { if(!Flag[n]&&min>U[n]){ index=n; min=U[n]; } n--; } Flag[index]=true; printf("本次被选中的标号:%d 本次Ui改变后结果为:",index); return index; } void Dijkstra(int m){ int NodeNum=0; while (NodeNum!=m) { int i=SearchNode(m);//算法的第三步,每次找Ui最小的 for (int j=1;j<=m;j++) { if (!Flag[j]&&Edge[i][j]!=INFINITY&&U[j]>U[i]+Edge[i][j])//算法的第三步后的后半句 { U[j]=U[i]+Edge[i][j]; Pre[j]=i; } } NodeNum++; for (int q=1;q<=m;q++)//为了输入每次的结果 { printf("%d ",U[q]); } printf("\n"); } } int main(int argc, char* argv[]) { int n=6; init(n);//初始化边和结点标志 Dijkstra(n); FOR(6){ printf("从1结点到%d结点的最短距离是:%d ,路线图是:\n",i,U[i]); //用反向追踪法获取路径。 int j=i; printf("%d",j); while (Pre[j]!=0)//我是发过来输出的 { printf("%d" ,Pre[j]); j=Pre[j]; } printf("\n"); } return 0; }
不要做一个似懂非懂的人,做一个脚踏实地的程序员