算法 单源最短路径Dijkstra
类似BFS
基于贪心算法
要求权值非负
#include <iostream>
using namespace std;
const int N=102;
const int INF=1000;// 权值最大范围,注意不要轻易使用int型范围
// 在计算 int tmp=min+g[k][j];过程中可能溢出
int g[N][N];
void init(int n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j]=g[j][i]=INF;
}
int dijkstra(int start,int end,int n)
{
int visit[n+1];
int len[n+1];
int path[n+1];
for(int i=1;i<=n;i++)
{
visit[i]=0;
len[i]=g[start][i];
path[i]=start;// 初始值都是直接到达s点
}
visit[start]=1;
len[start]=0;
path[start]=0;// s
int min=INF;
int k=-1;
for(int i=2;i<=n;i++)
{
min=INF;
k=-1;
for(int j=1;j<=n;j++)
{
if(visit[j]==0&&len[j]<min)
{
k=j;
min=len[j];
}
}
visit[k]=1;
if(k==end)break;// 终点距离最短已经得到,可以中断
for(int j=1;j<=n;j++)
{
int tmp=min+g[k][j];
if(visit[j]==0&&tmp<len[j])
{
len[j]=tmp;
path[j]=k;// 从S到达J的最短路径先经过K
}
}
}
return len[end];
}
int sum;
void func()
{
int n,m;
while(cin>>n>>m)
{
int start,end;
cin>>start>>end;
init(n+1);// 注意图要初始化
for(int i=0;i<m;i++)
{
int s,e,dis;
cin>>s>>e>>dis;
if(dis<g[s][e])// 注意重复数据的过滤
g[s][e]=g[e][s]=dis;
}
int mindis=dijkstra(start,end,n);
cout<<mindis<<endl;
}
// getchar();
}
int main(int argc, char *argv[])
{
//printf("Hello, world\n");
func();
return 0;
}