正费用网络算法
正费用网络算法
首先说明图中含有向负圈的是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;
}
不要做一个似懂非懂的人,做一个脚踏实地的程序员

浙公网安备 33010602011771号