文中代码下如下:
#include<iostream> #include<cstdio> #include<fstream> #include<algorithm> #include<string> #include<sstream> #include<cstring> using namespace std; int e[10][10],dis[10],book[10]; int main() { int i,j,n,m,t1,t2,t3,u,v,min; int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值 cin>>n>>m; //读入n和m,n表示顶点个数,m表示边的条数 //初始化 for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) e[i][j]=0; else e[i][j]=inf; //读入边 for(i=1;i<=m;i++) { cin>>t1>>t2>>t3;//t1 t2是顶点,t3是边 e[t1][t2]=t3; //给t1 t2之间的距离 赋值t3 } //初始化dis数组,这里是1号顶点到其余各个顶点的初始路程 for(i=1;i<=n;i++) dis[i]=e[1][i]; //book数组初始化 for(i=1;i<=n;i++) book[i]=0; //设所有最短路的顶点未知的 book[1]=1; //设置源点1是已知的顶点 //Dijkstra算法核心语句 for(i=1;i<=n-1;i++) { //找到离1号顶点最近的顶点(贪心法?) min=inf; for(j=1;j<=n;j++) { if(book[j]==0 && dis[j]<min)//因为book[1]=1已被设置为源顶点=1,所以这条语句 { // 实际上是找未知道顶点中离源顶点book[1]直接距离最近的顶点 min=dis[j];//更新最近的顶点 u=j; //最后把这个找到的最近顶点赋值给u,因为后面的book[u]要标记一下。 } } book[u]=1;//更新为离源顶点1最近的已知顶点 如果有优先队列优化 ,这里便是出队(最近的顶点) for(v=1;v<=n;v++)//松驰操作(BFS?拓展?) { if(e[u][v]<inf) { if(dis[v]>dis[u]+e[u][v])//dis[u]是的意思是源点1->u最近的距离,e[u][v]表示u顶点到v顶点的距离 //dis[u]+e[u][v]的意思就是1->u->v 的距离 dis[v]=dis[u]+e[u][v];//更新1->v的距离(包括直接或间接距离) } } } //输出最终的结果 for(i=1;i<=n;i++) cout<<dis[i]<<" ";//输出1号顶点到所有点的最短路 return 0; }