标签:des style blog http color strong
非负权值的单源最短路之 dijkstra
Tanky Woo之dijkstra: http://www.wutianqi.com/?p=1890
dijkstra-------我认为这个算法的核心思想是:最短路径长度递增。其实就是一个贪心算法。
怎么理解呢?
最短路的最优子结构:假如有一条最短路径已经存在了,那么其中任意两点的路径都将是最短的,否则假设是不成立了。
算法实现过程:
以poj 2457为例:
Part Acquisition
Description
Input
Output
Sample Input
6 5 1 3 3 2 2 3 3 1 2 5 5 4
Sample Output
4 1 3 2 5
Hint
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
#define maxn 1000+10
using namespace std;
int map[maxn][maxn];
int dis[maxn];
int pre[maxn];
int kind;
void dijkstra(int s)
{
int vis[maxn],minn,pos;
memset(vis,0,sizeof vis);
for(int i=0;i<kind+1;i++)
dis[i]=INF;
dis[s]=0;
for(int i=0;i<kind;i++)
{
minn=INF;
for(int j=1;j<=kind;j++)
if(!vis[j]&&minn>dis[j])
{
minn=dis[j];
pos=j;
}
vis[pos]=1;
for(int j=1;j<=kind;j++)
if(!vis[j]&&dis[j]>dis[pos]+map[pos][j])
{
pre[j]=pos;
dis[j]=dis[pos]+map[pos][j]; //每更新一遍dis ,刷新一遍 pre
}
}
}
void print_path(int aim) //路径输出函数
{
int n=dis[aim]; // dis是多少,就交换了多少次,有多少个前驱。
int path[maxn]; //倒着记录路径
int step=0,temp;
path[++step]=aim;
temp=aim;
printf("%d\n",n+1);
for(int i=0;i<n;i++)
{
temp=pre[temp];
path[++step]=temp;
}
for(int i=step;i>=1;i--) //倒着输出
printf("%d\n",path[i]);
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
int u,v;
kind=-1;
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
map[i][j]=INF;
for(int i=0;i<n;i++)
{
scanf("%d%d",&u,&v);
map[u][v]=1;
if(kind<max(u,v))
kind=max(u,v);
}
dijkstra(1);
if(dis[k]<INF)
print_path(k);
else
printf("-1\n");
}
return 0;
}
对dijkstra的浅见(引例 poj 2457),布布扣,bubuko.com
标签:des style blog http color strong
原文地址:http://blog.csdn.net/code_or_code/article/details/36385607