现在的位置: 首页 > 综合 > 正文

hdu 1874 畅通工程续

2017年05月27日 ⁄ 综合 ⁄ 共 1514字 ⁄ 字号 评论关闭

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

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

#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;
}

抱歉!评论已关闭.