正费用网络算法

正费用网络算法

首先说明图中含有向负圈的是NP问题。在本文中我们研究是正费用网络,所谓正费用网络,就是说边上的权重都是正的。下面介绍解决此类问题的一种算法,也就是Dijkstra算法。

算法描述:

设变量ui是从起点到i结点的最短距离的上限,pre(i)是达到ui时候的前一个结点。

uipre(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;
}

  

posted @ 2014-12-10 12:54  薛小黑  阅读(164)  评论(0编辑  收藏  举报