hdu1874 畅通工程续---dij

来源:互联网 发布:linux网络配置文件 编辑:程序博客网 时间:2024/05/22 05:26

题号不错。。再来水一道

发现这种类型题目很多坑 比如有没有给重边啊  比如对起点的处理。。


#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <cmath>#include <algorithm>#include <vector>#include <queue>#include <map>#define inf 0x3f3f3f3fusing namespace std;int n,m,sta,end,dis[210][210],d[210],vis[210];void dij(int a,int b){    int i,j,k,mm;    memset(vis,0,sizeof vis);    for(i=0;i<n;i++)        d[i]=dis[a][i];    vis[a]=1;d[a]=0;//dis[a][a]=inf    for(i=0;i<n;i++)    {        mm=inf;k=201;        for(j=0;j<n;j++)        {            if(!vis[j]&&d[j]<mm)            {                mm=d[j];                k=j;            }        }        if(k==b) break;        vis[k]=1;        for(j=0;j<n;j++)        {            if(!vis[j]&&(mm+dis[k][j]<d[j]))                d[j]=dis[k][j]+mm;        }    }}int main(){    int u,v,w,i,j;    while(~scanf("%d%d",&n,&m))    {        memset(dis,0x3f,sizeof dis);        for(i=0;i<m;i++)        {            scanf("%d%d%d",&u,&v,&w);            if(w<dis[u][v]) dis[u][v]=dis[v][u]=w;//第一个wa点        }        scanf("%d%d",&sta,&end);        /*if(sta==end)//虽然题目说了STA!=END 但我加上为什么就WA?!        {            printf("-1\n");            continue;        }*/        dij(sta,end);        printf("%d\n",d[end]==inf?-1:d[end]);    }    return 0;}