HDU 1874畅通工程续&HDU 2544 最短路(Dijsktra)

本文通过两个实例详细介绍了如何使用Dijkstra算法解决最短路问题,并且提供了HDU平台上的代码实现,包括HDU1874和HDU2544两道题目,帮助读者掌握算法应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两道最短路的水题,用来熟悉Dijsktra的用法,果断手写不copy模板。以为能First AC,结果还是挺波折的,弄了数据才过了。

思路很简单,完全是Dijsktra。学要注意的是1874里给的路径有重复的,也就是说A到B的路径可能不止一条,要选择一条最短的。还有就是要注意数组角标和给出坐标的差异。最好数组都统一从1开始。


HDU 1874

#include<iostream>
#include<string.h>
#define INF 0xfffff

using namespace std;

int map[205][205];
int prev[205];
int dist[205];
bool visited[205];
int n,m;

int Dijkstra(int s)
{
    for(int i=0;i<n;i++)
    {
        dist[i]=INF;
    }
    memset(prev,0,sizeof(prev));
    memset(visited,false,sizeof(visited));
    dist[s]=0;
    
    for(int i=1;i<n;i++)
    {
        int mindist=INF,p=0;
        for(int j=0;j<n;j++)
        {
            if(!visited[j])
            {
                if(dist[j]<mindist)
                {
                    mindist=dist[j];
                    p=j;
                }
            }
        }
        visited[p]=1;
        for(int j=0;j<n;j++)
        {
            if(map[p][j]!=0&&!visited[j])
            {
                int newdist=dist[p]+map[p][j];
                if(newdist<dist[j])
                {
                    dist[j]=newdist;
                    prev[j]=p;
                }
            }
        }
    }
    return 0;
}
        
    
int main()
{
    int a,b,k,s,t;
    //freopen("1874.in", "r", stdin);
    //freopen("18744.out", "w", stdout);
    while(cin>>n>>m)
    {
        memset(map,0,sizeof(map));
        for(int i=0;i<m;i++)
        {
            cin>>a>>b>>k;
            if(map[a][b]==0||map[a][b]>k)       //可能不止一条路
            {
                map[a][b]=k;
                map[b][a]=k;
            }
        }
        cin>>s>>t;
        Dijkstra(s);
        if(dist[t]==INF) cout<<"-1"<<endl;
        else cout<<dist[t]<<endl;
    }
    //fclose(stdin);
    //fclose(stdout);
    return 0;
}

HDU 2544

#include<iostream>
#define INF 0xfffff

using namespace std;

int map[210][210],dist[210],prev[210],V,E;
bool visited[210];

int Dijkstra(int s)
{
    for(int i=1;i<=V;i++)
    {
        dist[i]=INF;
    }
    memset(visited,0,sizeof(visited));
    memset(prev,-1,sizeof(prev));
    dist[s]=0;
    for(int j=2;j<=V;j++)
    {
        int mindist=INF,p=-1;
        for(int i=1;i<=V;i++)
        {
            if(!visited[i])
            {
                if(dist[i]<mindist)
                {
                    mindist=dist[i];
                    p=i;
                }
            }
        }
        visited[p]=1;
        for(int i=1;i<=V;i++)
        {
            if(map[p][i]&&!visited[i])
            {
                int newdist=dist[p]+map[i][p];
                if(dist[i]>newdist)
                {
                    dist[i]=newdist;
                    prev[i]=p;
                }
            }
        }
    }
    return 0;
}


int init()
{
    int a,b,k;
    memset(map,0,sizeof(map));
    cin>>V>>E;
    {
        if(V==0&&E==0) return false;
        for(int i=1;i<=E;i++)
        {
            cin>>a>>b>>k;
            if(map[a][b]==0||map[a][b]>k)
            {
                map[a][b]=k;
                map[b][a]=k;
            }
        }
    }
    return true;
}


int main()
{
    //freopen("2544.in", "r", stdin);
    //freopen("25444.out", "w", stdout);
    while(init())
    {
        Dijkstra(1);
        cout<<dist[V]<<endl;
    }
    //fclose(stdin);
    //fclose(stdout);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值