迪杰斯特拉算法求无向图最短路
#include<cstring>
#include<cstdio>
#include<algorithm>
#define inf 99999999
#define N 1010
using namespace std;
int map[N][N];//原储存矩阵
int dist[N];
int visited[N],s[N];
int n,m;void Dijkstra(int J)//求每个点到J的距离
{int j,i;memset(visited,0,sizeof(visited));for(i=0;i<=n;i++)//初始化距离dist[i]=inf;dist[J]=0;visited[J]=1;for(i=1; i<n; i++){for(j=1; j<=n; j++){if(!visited[j]&&map[J][j]<inf&&dist[J]+map[J][j]<dist[j])//有路,并且没走过,并且落脚后比原有路径更短{dist[j]=map[J][j]+dist[J];}}int min=inf;for(j=1; j<=n; j++)//再遍历所有点,找已经可以走的,并且没有做过起点的。{if(!visited[j]&&dist[j]<min){J=j;min=dist[j];//每次从最短的路走,搜出下一个落脚点}}visited[J]=1;//做过头点的标记if(min==inf)return;}
}int main()
{int i,j,k;while(~scanf("%d%d",&n,&m)){for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){if(i==j)map[i][j]=0;elsemap[i][j]=inf;}}int f;for(i=0;i<m;i++){scanf("%d%d%d",&j,&k,&f);if(f<map[j][k])map[j][k]=f;}Dijkstra(1);memset(s,0,sizeof(s));}return 0;
}