hdu 2544 最短路

稍微修改了一下hdu1874的代码就直接过了

不过 31ms 缺陷,一大缺陷

FSPA版:

#include<iostream>
#include<string>
#include<algorithm>
#define MAXN 110
using namespace std;
int  map[MAXN][MAXN]; //map[i,j]为初始输入的i到j的距离,未知的map[i,j]=INT_MAX;
int  dis[MAXN],Q[MAXN*100];
char vst[MAXN];
// 参数n表示结点数,s表示源点
int SPFA(int n, int s)
{
    // pri是队列头结点,end是队列尾结点
    int i, pri, end, p;
    memset(vst, 0, sizeof(vst));
     for(int i=0; i<MAXN; ++i)
        Q[i] = 0;
    for (i=1; i<=n; i++)
        dis[i] = INT_MAX;
    dis[s] = 0;
    vst[s] = 1;
    Q[1] = s; pri = 1; end = 2;
    while (pri < end)
    {
        p = Q[pri];
        for (i=1; i<=n; ++i)
        {
            //更新dis
            if (map[p][i]!=INT_MAX&&dis[p]+ map[p][i]<dis[i])
            {
                dis[i] = dis[p]+map[p][i];
                if (!vst[i])     //未在队列中
                {
                    Q[end++] = i;
                    vst[i] = 1;
                }
            }
        }
        vst[p] = 0;   // 置出队的点为未标记
        pri++;
    }
    return 1;
}
int main()
{
    int n,m;
    while(cin>>n>>m&&(n||m))
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                map[i][j]=INT_MAX;
        int a,b,len;
        for(int i=0;i<m;i++)
        {
            cin>>a>>b>>len;
            if(len<map[a][b])
            {
                map[a][b]=len;
                map[b][a]=len;
            }
        }
        SPFA(n,1);
        cout<<dis[n]<<endl;
    }
    return 0;
}

dijkstra版:

#include<iostream>
#include<string>
using namespace std;
bool s[101];
int c[110][110],dis[110],n,m;
void dijkstra()
{
    for(int i=1;i<=n;i++)
    {
        dis[i]=c[1][i];
    }
    dis[1]=0;
    for(int i=2;i<=n;i++)
    {
        int tmp=INT_MAX,v=1;
        for(int j=1;j<=n;j++)
            if(!s[j]&&dis[j]<tmp)
            {
                tmp=dis[j];
                v=j;
            }
        s[v]=1;
        for(int j=1;j<=n;j++)
            if(!s[j]&&c[v][j]<INT_MAX)
            {
                int newdis=dis[v]+c[v][j];
                if(newdis<dis[j])
                    dis[j]=newdis;
            }
    }
}
int main()
{
    int len;
    while(cin>>n>>m&&(n||m))
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                c[i][j]=INT_MAX;
        int a,b;
        for(int k=0;k<m;k++)
        {
            cin>>a>>b>>len;
            if(len<c[a][b])
            {
             c[a][b]=len;
             c[b][a]=len;
            }
        }
        memset(s,0,sizeof(s));
        s[1]=1;
        dijkstra();
            cout<<dis[n]<<endl;
    }
    return 0;
}
posted @   枕边梦  阅读(278)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现
点击右上角即可分享
微信分享提示