题目
这个题目,个人认为对于真正理解dijkstra算法的人来说 不难 然自己刚开始就是理论可以但是到了具体的代码实现有一定难度 这几天也算是下定决心重温了几遍 真的是过程艰难 结果还是挺好
#include<iostream>
#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f//表示一个很大的数(0x 十六进制)
using namespace std;
int dis[200];//用来存储当前点到源点的最短路径信息
int vis[200];//用来表示访问过的节点 0未访问过 1访问过
int map[200][200];//用来存储两点之间的距离长度
int N,M;
void initialise()
{
int i,j;
memset(vis,0,sizeof(vis));//初始化vis为0 都未访问过
memset(dis,inf,sizeof(dis));//初始化dis为最大值
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{//当i等于j表示从节点a到节点a 显然为0(即从这个城镇到这个城镇不用行走)
if(i==j) map[i][j]=0;
else map[i][j]=inf;
}
}
}
void dijkstra(int v)
{
int i,j,u,tmp;
for(i=0;i<N;i++)
dis[i]=map[v][i];
dis[v]=0;
vis[v]=1;
for(i=0;i<N;i++)
{
u=v;
tmp=inf;
for(j=0;j<N;j++)
{
if(!vis[j]&&dis[j]<=tmp)
{
u=j;
tmp=dis[j];
}
}
vis[u]=1;//表示已访问
for(j=0;j<N;j++)
{//更新dis 使其存储当前源点的最短路径
if(!vis[j]&&map[u][j]<inf)
{
int newdis=dis[u]+map[u][j];
if(newdis<dis[j])
dis[j]=newdis;
}
}
}
}
int main()
{
int i,a,b,x,start,end,j;
while(scanf("%d %d",&N,&M)!=EOF)
{initialise();
for(i=0;i<M;i++)
{
scanf("%d %d %d",&a,&b,&x);
if(x<map[a][b])
{//路可以从a到b也可b到a 所以应该是无向图
map[a][b]=x;
map[b][a]=x;
}
}
scanf("%d %d",&start,&end);
dijkstra(start);
if(dis[end]==inf) cout<<"-1"<<endl;
else cout<<dis[end]<<endl;
}
return 0;
}
加油