基于visual Studio2013解决算法导论之044最短路径




题目

最短路径


解决代码及点评

// 26最短路径dijstra.cpp : 定义控制台应用程序的入口点。
//

#include <iostream>
using namespace std;
const int N=1000;
/*
单源最短路径:Dijkstra算法
算法思想:
从源点开始,每次合并距离源点所在集合最近的点到源点集合,距离用dis[]记录,
合并之后应用松弛原理更新dis[]的值.直到所有的点均在源点集合,或者发现了图不连通.
应用范围:
有向图,边的权值非负.
*/
template <class T>
struct Node
{
	Node(int t=0,T c=0,Node * n=NULL):to(t),cost(c),next(n){}
	int to;
	T cost;
	Node * next;
};
/*
n:图中结点个数
link:图的邻接表表示
dis:存放距离的数组
pre:存放结点前驱的数组
*/
template <class T>
bool Dijkstra(const int & n,Node<T> * link[N],T * dis,int * pre=NULL)
{
	memset(dis,0x3f,sizeof(T)*n);
	if(pre)
		memset(pre,-1,sizeof(int)*n);
	bool vst[N]={false};
	dis[0]=0;
	int i,j;
	for(i=0;i<n;i++)
	{
		T Max=0x3f3f3f3f;
		int idx=-1;
		for(j=0;j<n;j++)
		{
			if(! vst[j] && dis[j]<Max)
			{
				Max=dis[j];
				idx=j;
			}
		}
		if(idx==-1)
			return false;
		vst[idx]=true;
		Node<T> * p=link[idx];
		while(p)
		{
			if(p->cost+dis[idx]<dis[p->to])
			{
				dis[p->to]=p->cost+dis[idx];
				if(pre)
					pre[p->to]=idx;
			}
			p=p->next;
		}
	}
	return true;
}
template <class T>
void AddNode(Node<T> * * arr,int a,int b,T c)
{
	arr[a]=new Node<T>(b,c,arr[a]);
}
int main()
{
	int n;
	int a,b,c;
	Node<int> * link[N];
	memset(link,0,sizeof(link));
	//scanf("%d",&n);
	n=6;
	//while(scanf("%d%d%d",&a,&b,&c)!=EOF)
	AddNode(link,0,1,5);
	//AddNode(link,0,1,4);
	AddNode(link,1,3,1);
	AddNode(link,1,2,6);
	AddNode(link,1,4,16);
	AddNode(link,3,4,1);
	AddNode(link,3,5,9);
	AddNode(link,4,5,1);
	int dis[N],pre[N];
	Dijkstra(n,link,dis,pre);
	for(int i=0;i<n;i++)
		printf("%d %d\n",dis[i],pre[i]);
	system("pause");
	return 0;
}



代码下载及其运行

代码下载地址:http://download.csdn.net/detail/yincheng01/6858815

解压密码:c.itcast.cn


下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:

1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”


2)在下拉框中选择相应项目,项目名和博客编号一致

3)点击“本地Windows调试器”运行


程序运行结果









你可能感兴趣的:(基于visual Studio2013解决算法导论之044最短路径)