Dijkstra求图的最短路径
#include<stdio.h> #include<iostream> #include<stdlib.h> #define maxdist 9999//距离无穷远 #define MAX 100//图中结点数目最大值 using namespace std; struct a{ int v,n;//v是结点个数,n是边的个数 int adj[MAX][MAX];//邻接矩阵 }Graph; int sure[MAX]; int dist[MAX]; int aim; void dijkstra(int v0){//v0是结点编号,某人编号是从1开始的,所以我之后的矩阵要去掉0 //v是结点个数(1~n) n是边的个数 adj是邻接矩阵 dist[v0]=0; sure[v0]=1; //标记当前结点已经确定了最短路径 for(int i=1;i<=Graph.v;i++){//初始化dist if(i!=v0){ dist[i]=Graph.adj[v0][i]; } } for(int j=2;j<=Graph.v;j++){ //找dist里面最小的 进行更新 int min=maxdist; int subscript; for(int i=1;i<=Graph.v;i++){//从未确定的结点中找最小的 if(sure[i]==0&&dist[i]<min){ min=dist[i]; subscript=i; } } //结点subcript已经确定 sure[subscript]=1; //用新标记的结点来更新 dist中未确定的结点 for(int i=1;i<=Graph.v;i++){ if(sure[i]==0&&Graph.adj[subscript][i]+min<dist[i]){//当前结点不确定 且距离可以缩小 dist[i]=Graph.adj[subscript][i]+min; } } } } int main(){//矩阵和数组都是从1开始 //memset(sure,0,sizeof(int)); cin>>Graph.v>>Graph.n; //接收每一条边,然后赋值邻接矩阵 for(int i=1;i<=Graph.v;i++){ for(int j=1;j<=Graph.v;j++){ Graph.adj[i][j]=maxdist; } } for(int i=0;i<Graph.n;i++){ int x,y; cin>>x>>y; cin>>Graph.adj[x][y]; Graph.adj[y][x]=Graph.adj[x][y]; } //邻接矩阵赋值完毕 接收起始结点aim //for(int i=1;i<=Graph.v;i++){ // for(int j=1;j<=Graph.v;j++){ // if(j==1) cout<<Graph.adj[i][j]; // else cout<<" "<<Graph.adj[i][j]; // } // cout<<endl; // } cin>>aim; dijkstra(aim); for(int i=1;i<=Graph.v;i++){ cout<<i<<": "<<dist[i]<<endl; } }
dist[i] 保存目标起点v0到结点i的路径长短,将不断更新。
sure[i] =1表示此时dist[i]的值是 v0到结点i的最短路径长度