hdu 1874 畅通工程续

来源:互联网 发布:折线统计图数据举例 编辑:程序博客网 时间:2024/06/16 14:59

   题目:点击打开链接。

   dijkstra,上代码。

#include<stdio.h>#include<string.h>#define INF 0x3f3f3f3f//定义一个比较大的值,表示此路不通int g[202][202],dis[202];bool vis[202];//下标对应的点被访问的情况void dijkstra(int s,int n){    for(int i=0;i<n;++i)    {        dis[i]=g[s][i];//初始化数组        vis[i]=false;    }    dis[s]=0;//对应起点与终点相同的情况。    vis[s]=true;//表示该点已被访问    for(int i=0;i<n;++i)    {        int mark=s;//可以是s也可以是别的负数。        int mindis=INF;        for(int j=0;j<n;++j)        {            if(!vis[j]&&mindis>dis[j])            {                mark=j;                mindis=dis[j];            }        }//找到当前情况下与起点距离最近的点,该距离为俩点之间最近的点。        if(mark==s)//剪枝,可以没有            break;        vis[mark]=true;//中间的jiedian        for(int j=0;j<n;++j)            if(!vis[j]&&dis[j]>dis[mark]+g[mark][j])                dis[j]=dis[mark]+g[mark][j];//更新    }}int main(){    int m,n,a,b,x,s,t;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(int i=0;i<n;++i)            for(int j=0;j<n;++j)                g[i][j]=INF;//初始化        for(int i=0;i<m;++i)        {            scanf("%d%d%d",&a,&b,&x);            if(g[a][b]>x)//输入数据中两点之间可能有多个数据取最小的            {                g[a][b]=x;                g[b][a]=x;            }        }        scanf("%d%d",&s,&t);        dijkstra(s,n);        printf("%d\n",dis[t]==INF?-1:dis[t]);    }    return 0;}


0 0