
题目
最短路径
解决代码及点评
// 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调试器”运行
程序运行结果