单源最短路Dijstra

#include<iostream>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
int edge[105][105],d[105];
int Dijstra(int st,int n)
{
    int mark[105],minn,minn_num;
    memset(mark,0,sizeof(mark));
    for(int i=1;i<n;i++)
    {
        d[i]=edge[0][i];
    }
    d[0]=0;
    mark[0]=1;
    for(int i=1;i<n;i++)
    {
        int minn=INF;
        for(int j=0;j<n;j++)
        {
            if(mark[j]==0&&d[j]<=minn)
            {
                minn=d[j];
                minn_num=j;
            }
        }
        mark[minn_num]=1;
        for(int j=0;j<n;j++)
        {
            if(d[j]>minn+edge[minn_num][j])
            {
                d[j]=minn+edge[minn_num][j];
            }
        }
    }
}
int main()
{
    int n,m,x,y,val;
    while(cin>>n>>m)
    {
        if(n==0&&m==0)
            break;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(i==j)
                edge[i][j]=0;
                else
                    edge[i][j]=INF;
            }
        }
        for(int i=0;i<m;i++)
        {
            cin>>x>>y>>val;
            edge[x-1][y-1]=val;
            edge[y-1][x-1]=val;
        }
        Dijstra(0,n);
        cout<<d[n-1]<<endl;
    }
}

 

posted @ 2019-05-08 22:14  Leozi  阅读(100)  评论(0编辑  收藏  举报