dijstra+输出路径总结

#include<iostream>  
#include<math.h>  
#include<memory.h>  
using namespace std;  
#define inf 0x3f3f3f3f  
int n,m;//n现有城镇数目,m道路数目  
int map[300][300];  
int dis[300],vis[300];  
int path[500];   
void dijkstra(int a,int b)  
{  
    int i,j,k,minn;  
    for(i=0;i<n;i++)  
    {  
        dis[i]=map[a][i];  
        vis[i]=0;  
        path[i]=a;  
    }  
    vis[a]=1;  
    for(i=0;i<n;i++)  
    {  
        minn=inf;  
        for(j=0;j<n;j++)  
        {  
            if(vis[j]==0&&dis[j]<minn)  
            {  
                k=j;  
                minn=dis[j];  
            }  
        }  
        vis[k]=1;  
        for(j=0;j<n;j++)  
        {  
            if(vis[j]==0&&dis[j]>dis[k]+map[k][j])  
            {  
                dis[j]=dis[k]+map[k][j];  
                path[j]=k;  //j是从k过来的
            }  
        }  
    }  
}  
int main()  
{  
    while(scanf("%d%d",&n,&m)!=EOF)  
    {  
        int a,b,x,s,e;  
        memset(map,inf,sizeof(map));  
        for(int i=0;i<m;i++)  
        {  
            cin>>a>>b>>x;  
            if(map[a][b]>x)//城镇之间道路不止一条   
            map[a][b]=map[b][a]=x;  
        }  
        cin>>s>>e;  
        dijkstra(s,e);  
          
        int p[500],k=0,temp=e; //输出路径   
        while(temp!=s)  
        {     
            p[k++]=temp;  //一开始p[0]=终点
            temp=path[temp]; //倒着来,是谁推向temp的 
        }  
        p[k]=s;  
        for(int i=k;i>0;i--)  
            cout<<p[i]<<" ";  
        cout<<p[0]<<endl;  
    }  
 }   

 

posted on 2018-03-23 22:38  蔡军帅  阅读(127)  评论(0编辑  收藏  举报