求最短路径
迪杰斯特拉算法1
/*
算法思路:
1.初始化距离
dist[1]=0,dist[i]=正无穷
2.集合s存当前已经确定最短距离的点
for i 1-n
找到一个不在s中且最短的t
将t放到s中
用t更新其他点的dist
时间复杂度O(n方)
*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include <climits>
using namespace std;
const int N=510;
int g[N][N];
int dist[N];
bool st[N];
int n,m;
int dijkstra(){
memset(dist,0x3f,sizeof dist);
dist[1]=0;//初始化别忘了
for(int i=1;i<=n;i++){
int t=-1;
for(int j=1;j<=n;j++){
if(!st[j]&&(t==-1||dist[j]<dist[t]))
t=j;
}
for(int j=1;j<=n;j++)
dist[j]=min(dist[j],dist[t]+g[t][j]);
st[t]=true;//这里别忘了
}
if(dist[n]==0x3f3f3f3f)
return -1;
else
return dist[n];
}
int main(){
memset(g,0x3f,sizeof g);
cin>>n>>m;
while(m--){
int x,y,z;
cin>>x>>y>>z;
g[x][y]=min(g[x][y],z);//处理重边,因为短的边比长的好
}
cout<<dijkstra();
return 0;
}