2020-02-13
朴素Djikstra算法
算法原理:
集合s : 当前已经确定最短距离的点
① dis[1] = 0,dis[其他点] = 极大值。
② for( i从1到n)
{
找到不在s中的 距离最近的点。(设为t)
把t加入s
用t更新其他点的距离(看一下从1->x点的距离是否大于1->t->x的距离,如果大于则更新)
}
存储 稠密图使用邻接矩阵 稀疏图使用邻接表
代码实现待更新。
//acwing 849
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 510;
int n,m;
int g[N][N];
int dist[N];
bool st[N];
int dijkstra()
{
memset(dist,0x3f,sizeof dist);
dist[1] = 0;
for (int i=0; i<=n; i ++)
{
int t = -1;
for(int j = 1;j <= n; j ++)
if(!st[j] && ( t == -1 || dist[t] > dist[j]))
t = j;
if(t==n) break; //优化
st[t]= true;
for (int j = 1; j <= n; j ++ )
dist[j]= min(dist[j],dist[t] + g[t][j]);
}
if (dist[n]== 0x3f3f3f3f) return -1;
return dist[n];
}
int main()
{
scanf("%d%d",&n,&m);
/*
for(int i = 1;i<=n;i ++ )
for(int j = 1; j <= n; j ++ )
if( i == j ) g[i][j] = 0;
else g[i][j] = INF;
*/
memset(g, 0x3f,sizeof g);
while(m -- )
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a][b] = min(g[a][b],c);
}
int t = dijkstra();
printf("%d\n",t);
return 0;
}