图结构练习——最短路径(dijkstra算法)

来源:互联网 发布:mac用什么flash player 编辑:程序博客网 时间:2024/05/22 00:00

Problem Description

 给定一个带权无向图,求节点1到节点n的最短路径。
 

Input

 输入包含多组数据,格式如下。
第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
 

Output

 每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
 

Example Input

3 21 2 11 3 11 0

Example Output

10

注意:最短路覆盖


#include<iostream>#include<stdio.h>#include <cstring>using namespace std;const int inf=99999999;int amap[105][105];int book[105];int dis[105];int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {       if(m==0)       {           cout<<0<<endl;           continue;       }               memset(book,0,sizeof(book));        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)        {            if(i==j)amap[i][j]=0;            else amap[i][j]=inf;        }        for(int i=1;i<=m;i++)        {            int x,y,z;            cin>>x>>y>>z;           if(amap[x][y]>z)      //避免覆盖最短路            amap[x][y]=amap[y][x]=z;        }        for(int i=1;i<=n;i++)     //dis数组初始化        {            dis[i]=amap[1][i];        }        book[1]=1;        for(int i=1;i<=n-1;i++)    //1到n-1        {            int amin=inf;            int a;            for(int j=1;j<=n;j++)            {                if(book[j]==0&&dis[j]<amin)                {                    amin=dis[j];                    a=j;                }            }            book[a]=1;            for(int i=1;i<=n;i++)            {                if(amap[a][i]<inf)                {                    if(dis[i]>dis[a]+amap[a][i])                        dis[i]=dis[a]+amap[a][i];                }            }        }        cout<<dis[n]<<endl;    }    return 0;}






























原创粉丝点击