一只姓梁的monkey 2023-08-12 09:20 采纳率: 53.8%
浏览 6

C++ Dijkstra

题目 http://ybt.ssoier.cn:8088/problem_show.php?pid=1381
这里使用的是链式前向星存图
为什么输出是错误的?


#include<iostream>
using namespace std;
const int inf=0x3f3f3f;
struct node
{
    int n,next,w;
} S[10001];
int head[10001],d[10001],v[10001],tot=0,n,m;
void in(int n,int m,int w)
{
    tot++;
    S[tot].n=m;
    S[tot].w=w;
    S[tot].next=head[n];
    head[n]=tot;
}
void F(int x)
{
    for(int i=0; i<=n; i++)
    {
        d[i]=inf;
    }
    d[x]=0;
    for(int l=1; l<=n; l++)
    {
        int u=0;
        for(int i=1; i<=n; i++)
        {
            if(d[i]<d[u] && v[i]==0)
            {
                u=i;
            }
        }
        v[u]=1;
        for(int i=head[x]; S[i].n!=0; i=S[i].next)
        {
            if(d[u]+S[i].w<d[i])
            {
                d[i]=d[u]+S[i].w;
            }
        }
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        int x,y,w;
        cin>>x>>y>>w;
        in(x,y,w);
    }
    F(1);
    cout<<d[n];
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-12 12:24
    关注

    【以下回答由 GPT 生成】

    原因分析: 1. 在链式前向星存图的实现中,代码中的head[x]应该是head[u],因为要遍历以u为起点的所有边。这是一个拼写错误。

    解决方案: 将代码中的head[x]改为head[u]

    优化错误输出: 修改代码中的输出语句,当d[n]为inf时,输出"无法到达"。

    修改后的代码如下:

    #include<iostream>
    using namespace std;
    const int inf=0x3f3f3f;
    struct node
    {
        int n,next,w;
    } S[10001];
    int head[10001],d[10001],v[10001],tot=0,n,m;
    void in(int n,int m,int w)
    {
        tot++;
        S[tot].n=m;
        S[tot].w=w;
        S[tot].next=head[n];
        head[n]=tot;
    }
    void F(int x)
    {
        for(int i=0; i<=n; i++)
        {
            d[i]=inf;
        }
        d[x]=0;
        for(int l=1; l<=n; l++)
        {
            int u=0;
            for(int i=1; i<=n; i++)
            {
                if(d[i]<d[u] && v[i]==0)
                {
                    u=i;
                }
            }
            v[u]=1;
            for(int i=head[u]; S[i].n!=0; i=S[i].next)
            {
                if(d[u]+S[i].w<d[S[i].n])
                {
                    d[S[i].n]=d[u]+S[i].w;
                }
            }
        }
    }
    int main()
    {
        cin>>n>>m;
        for(int i=1; i<=m; i++)
        {
            int x,y,w;
            cin>>x>>y>>w;
            in(x,y,w);
        }
        F(1);
        if(d[n]==inf)
        {
            cout<<"无法到达";
        }
        else
        {
            cout<<d[n];
        }
    }
    

    请注意:这只是一种可能的解决方案,可能还存在其他错误或优化点。如果这个解决方案不能解决您的问题,请提供更多的信息。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 8月12日

悬赏问题

  • ¥20 白日门传奇少一个启动区服和启动服务器的快捷键,东西都是全的 , 他们说套一个出来就行了 但我就是弄不好,谁看看,
  • ¥15 昨天电脑装了matlab好像多了个虚拟盘,关机前还被舍友插了usb不知道干了什么,今天开机电脑就变这样了,求解答
  • ¥100 如何用js写一个游戏云存档
  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计