Dijkstra算法
适用条件:无负的边权。
和Bellman-ford算法做比较,就是不适用有负边的情况,而Bellman-ford只是不适用有负圈的情况(有负圈就没有最短路)。dijkstra在Bellman-ford这些方面做了优化。提高了效率。
1.每次找到最短距离已经确定的点,从它出发更新相邻顶点的最短距离.
2.不再关心,Bellman-ford算法种最短距离已经确定的点(因为在Bellman-ford中每次循环,都需要刷一遍所有的点)。
复杂度为|V*V|
//
// Created by luozujian on 17-10-14.
//
//dijkstra最短路算法
//不能有负的权值
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std;
const int maxv = 1e2+5;
int d[maxv];
int cost[maxv][maxv];
int used[maxv];
int E,V;
void dijkstra(int s)
{
fill(used,used+maxv,false);
fill(d,d+maxv,INF);
d[s] = 0;
while(true)
{
int v = -1;
for(int u=1;u<=V;u++)
{
if(!used[u] && (v == -1 || d[u] < d[v])) v = u;
}
if(v == -1) break;
used[v] = true;
for(int u=1;u<=V;u++)
{
d[u] = min(d[u],d[v] + cost[v][u]);
}
}
}
void solve()
{
dijkstra(1);
for(int i=1;i<=V;i++)
{
printf("%d\n",d[i]);
}
}
int main()
{
scanf("%d%d",&E,&V);
for(int i=1;i<=V;i++)
{
for(int j=1;j<=V;j++)
{
cost[i][j] = INF;
}
}
for(int i=0;i<E;i++)
{
int s,t,cost1;
scanf("%d%d%d",&s,&t,&cost1);
cost[s][t] = cost1;
cost[t][s] = cost1;
}
solve();
return 0;
}