非负权值的单源最短路之 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
#include
#include
#include
#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;idis[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=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
void print(int v)
{
int temp;
//printf("%d\n",dis[v]+1);
if(v==1)
printf("1\n");
else
{
temp=pre[v];
print(temp);
printf("%d\n",v);
}
}