asuml

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
#include <iostream>
#include <cstring>

#define MAXI 105
#define INF 0x3f3f3f
using namespace std;

int a[MAXI][MAXI];    //无向图
int dist[MAXI];        //到各个点的最短路径
int n,m;        //顶点数和边数
int prev[MAXI];        //路径

void Dijkstra(int v0)
{
    bool s[MAXI];        //顶点集合
    for(int i=1;i<=n;i++)    //初始化
    {
        s[i]=false;
        dist[i]=a[v0][i];
        if(a[v0][i]<INF)
            prev[i]=v0;
        else
            prev[i]=-1;
    }
    dist[v0]=0;
    s[v0]=true;
    for(int i=2;i<=n;i++)
    {
        int u=v0;
        int maxx=INF;
        for(int j=1;j<=n;j++)
            if(!s[j]&&dist[j]<maxx)
            {
                u=j;
                maxx=dist[j];
            }
        s[u]=true;
        for(int j=1;j<=n;j++)
        {
            if(!s[j]&&a[u][j]<INF)
            {
                if(dist[j]>dist[u]+a[u][j])
                {
                    dist[j]=dist[u]+a[u][j];
                    prev[j]=u;
                }
            }
        }
    }
}
void creat()
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            a[i][j]=INF;
    for(int i=1;i<=n;i++)
        a[i][i]=0;
}

int main()
{
    int t;
    int w,u,v;
    cin>>n>>m;
    creat();
    for(int i=0;i<m;i++)
    {
        cin>>u>>v>>w;
        a[u][v]=w;
        a[v][u]=w;
    }
    Dijkstra(1);
    for(int i=1;i<=n;i++)
        cout<<dist[i]<<" ";
    t=7;
    while(t!=1)
    {
        cout<<prev[t]<<"->";
        t=prev[t];
    }
    return 0;
}
/*
7 12
1 2 7
1 3 9
1 6 14
2 3 10
2 4 15
3 4 11
3 6 2
4 5 6
5 6 9
7 4 7
7 5 5
7 6 3
*/

 

posted on 2017-03-29 18:58  asuml  阅读(173)  评论(0编辑  收藏  举报