hdu1874-畅通工程续(最短路)

来源:互联网 发布:淘宝店铺名字测吉凶 编辑:程序博客网 时间:2024/06/05 14:56
/*模版题,,不过还是wa好多次,郁闷,,原来是题目两个点之间可以修很多条路,选最短的,然后DIJKSTRA就OK*/#include <stdio.h>#include <string.h>#define MAXN 200#define inf 9999999typedef int elem_t;/*套了zju的o(∩_∩)o */void dijkstra(int n,elem_t mat[][MAXN],int s,elem_t* min,int* pre){int v[MAXN],i,j,k;for (i=0;i<n;i++)min[i]=inf,v[i]=0,pre[i]=-1;for (min[s]=0,j=0;j<n;j++){for (k=-1,i=0;i<n;i++)if (!v[i]&&(k==-1||min[i]<min[k]))k=i;for (v[k]=1,i=0;i<n;i++)if (!v[i]&&min[k]+mat[k][i]<min[i])min[i]=min[k]+mat[pre[i]=k][i];}}int main(){    int n,m,a,b,x,s,t,i,j;    elem_t mat[MAXN][MAXN];    elem_t min[MAXN],pre[MAXN];    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i=0;i<n;++i)            for(j=0;j<n;++j)                mat[i][j]=inf;        for(i=0;i<m;++i)        {            scanf("%d%d%d",&a,&b,&x);            if(mat[a][b]>x)            {                mat[a][b]=x;                mat[b][a]=x;            }        }        scanf("%d%d",&s,&t);        dijkstra(n,mat,s,min,pre);        if(min[t]==inf)printf("%d\n",-1);        else printf("%d\n",min[t]);    }    return 0;}

闲的没事做,,,自己也写了个dijkstra

#include <stdio.h>#define NUM 200#define inf 1000000void dijkstra(int n,int s,int mat[NUM][NUM],int *dist,int *prev){    int v[NUM],i,j,u,min;    for(i=0;i<n;++i)    {        dist[i]=mat[s][i];        v[i]=0;        if(i!=s && dist[i]<inf)prev[i]=s;        else prev[i]=-1;    }    v[s]=1;dist[s]=0;    for(i=0;i<n-1;++i)    {        min=inf;        u=s;        for(j=0;j<n;++j)        {            if(!v[j] && dist[j]<min)            {                min=dist[j];                u=j;            }        }        v[u]=1;        for(j=0;j<n;++j)        {            if(!v[j] && mat[u][j]<inf && dist[u]+mat[u][j]<dist[j])            {                dist[j]=dist[u]+mat[u][j];                prev[j]=u;            }        }    }}int main(){    int mat[NUM][NUM],dist[NUM],prev[NUM];    int n,m,s,t,a,b,c,i,j;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i=0;i<n;++i)        for(j=0;j<n;++j)        mat[i][j]=inf;        for(i=0;i<m;++i)        {            scanf("%d%d%d",&a,&b,&c);            if(mat[a][b]>c)            {                mat[a][b]=mat[b][a]=c;            }        }        scanf("%d%d",&s,&t);        dijkstra(n,s,mat,dist,prev);        if(dist[t]==inf)printf("-1\n");        else printf("%d\n",dist[t]);    }    return 0;}