hdu 1874 畅通工程续

来源:互联网 发布:python调用shell脚本 编辑:程序博客网 时间:2024/06/04 19:24

第一次接触最短路问题,折腾了一下午,基本框架出来了,可总是卡在一些细节。。。

关键最后还有一个可能有重复路段,需要取其中最小值。。。伤不起


#include<stdio.h>#include<string.h>#define mi 9999999#define min(a,b) (a>b? b:a)int map[202][202];int vis[202];int divs[202];int ans;int n,m;void prim(int b){    int k;    for(int j=1; j<n; j++)    {        int min=mi;        for(int i=0; i<n; i++)            if(!vis[i]&&min>divs[i])            {                min=divs[i];                k=i;            }        vis[k]=1;        for(int i=0; i<n; i++)            if(!vis[i]&&divs[k]+map[k][i]<divs[i])                divs[i]=divs[k]+map[k][i];    }}int main(){    while(~scanf("%d%d",&n,&m))    {        memset(vis,0,sizeof(vis));        for(int i=0; i<n; i++)        {            for(int j=0; j<n; j++)                map[i][j]=mi;            map[i][i]=0;        }        int a,b,c;        for(int 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[b][a],c);        }        scanf("%d%d",&a,&b);        for(int i=0; i<n; i++)            divs[i]=map[a][i];        divs[a]=0;        prim(b);        printf("%d\n",divs[b]==mi?-1:divs[b]);    }    return 0;}


后来,在学习spfa算法的时候,又回头做了这道题。

附上代码:

#include<stdio.h>#include<string.h>#include<queue>using namespace std;int map[202][202];int vis[202];int d[202];int n,m;int s,e;void spfa(){    queue <int>  q;    int a;    q.push(s);    for(int i=0; i<n; i++)        d[i]=0x7ffffff;    d[s]=0;    vis[s]=1;    while(!q.empty())    {        a=q.front();        q.pop();        vis[a]=0;        for(int i=0; i<n; i++)        {            if(d[i]>map[a][i]+d[a])            {                d[i]=map[a][i]+d[a];                //printf("**%d  %d   %d  %d\n",i,d[i],map[a][i],d[a]);                if(!vis[i])                {                    q.push(i);                    vis[i]=1;                }            }        }    }}int main(){    while(~scanf("%d%d",&n,&m))    {        int a,b,c;        memset(vis,0,sizeof(vis));        for(int i=0; i<n; i++)            for(int j=0; j<n; j++)                map[i][j]=0x7ffffff;        for(int i=0; i<m; i++)        {            scanf("%d%d%d",&a,&b,&c);            map[a][b]=map[b][a]=map[a][b]>c?c:map[a][b];        }        scanf("%d%d",&s,&e);        spfa();        if(d[e]==0x7ffffff)            printf("-1\n");        else            printf("%d\n",d[e]);    }    return 0;}



0 0
原创粉丝点击