最短路径(迪杰斯特拉算法)

    xiaoxiao2022-07-14  148

    #include<iostream> using namespace std; #include<cstring> #define maxSize 100 #define INF 0x3f3f3f3f typedef struct { int no; //顶点编号 char info; //顶点其他信息 }VertexType; typedef struct { int edges[maxSize][maxSize]; int n,e; //分别为顶点数和边数 VertexType vex[maxSize]; //存放结点信息 }MGraph; void printfPath(int path[],int a) { int stack[maxSize],top=-1; while(path[a]!=-1) { stack[++top]=a; a=path[a]; } stack[++top]=a; while(top!=-1) cout<<stack[top--]<<" "; cout<<endl; } void Dijkstra(MGraph g,int v,int dist[],int path[]) { int set[maxSize]; int min,i,j,u; for(i=0;i<g.n;++i) { dist[i]=g.edges[v][i]; set[i]=0; if(g.edges[v][i]<INF) path[i]=v; else path[i]=-1; } set[v]=1;path[v]=-1; for(i=0;i<g.n-1;++i) { min=INF; for(j=0;j<g.n;++j) if(set[j]==0&&dist[j]<min) { u=j; min=dist[j]; } set[u]=1; for(j=0;j<g.n;++j) { if(set[j]==0&&dist[u]+g.edges[u][j]<dist[j]) { dist[j]=dist[u]+g.edges[u][j]; path[j]=u; } } } } /* 7 12 0 1 4 0 2 6 0 3 6 1 4 7 1 2 1 3 2 2 2 4 6 3 5 5 2 5 4 5 4 1 4 6 6 5 6 8 */ int main() { MGraph g; int n,e,sum; cin>>n>>e; g.n=n,g.e=e; memset(g.edges,INF,sizeof(g.edges)); for(int i=0;i<g.e;++i) { int a,b,w; cin>>a>>b>>w; g.edges[i][i]=0; g.edges[a][b]=w; } int dist[maxSize],path[maxSize]; Dijkstra(g,0,dist,path); for(int i=0;i<n;++i) cout<<dist[i]<<" "; cout<<endl; printfPath(path,6); }

     

    最新回复(0)