hdu1874 畅通工程续 (最短路)

来源:互联网 发布:网络主题团日活动 编辑:程序博客网 时间:2024/05/18 02:13


已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
//经典的单源 最短路 ,用Dijkstra,这里要注意的是有重边,取最小的那个。


已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。//经典的单源 最短路 ,用Dijkstra,这里要注意的是有重边,取最小的那个。#include<iostream>#include<cstdio>#define min(a,b) (a>b? b:a)#define inf 100000000using namespace std;int map[200][200];int d[200],f[200];//d  表示可访问的结点,f表示开始到现在的距离int n,m;void pri(){int i;for(i=0;i<n;i++)printf("%d ",f[i]);printf("\n");}void Dijkstra(int s,int e){    int i,j;    int minj,min;    for(i=0;i<n;i++)//初始化    {        f[i]=map[s][i];        d[i]=1;    }    f[s]=0;    for(i=0;i<n;i++)//用i条路    {        min=inf;        for(j=0;j<n;j++)        {            if(d[j]!=0&&f[j]<min)            {                min=f[j];                minj=j;            }        }        d[minj]=0;        for(j=0;j<n;j++)        {            if(d[j]!=0&&f[j]>f[minj]+map[minj][j])//之前决策点minj到j 和原来的j的比较            {                f[j]=f[minj]+map[minj][j];            }        }    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        int i,j;        int s,e;        for(i=0;i<n;i++)        {            for(j=i+1;j<n;j++)            {                map[i][j]=inf;                map[j][i]=inf;            }            map[i][i]=0;        }        int a,b,c;        for(i=0;i<m;i++)        {            scanf("%d%d%d",&a,&b,&c);            map[a][b]=min(map[a][b],c);            map[b][a]=min(map[a][b],c);            }        scanf("%d%d",&s,&e);        Dijkstra(s,e);        if(f[e]!=inf)printf("%d\n",f[e]);        else printf("-1\n");    }    return 0;}


原创粉丝点击