题目 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];
}
【以下回答由 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];
}
}
请注意:这只是一种可能的解决方案,可能还存在其他错误或优化点。如果这个解决方案不能解决您的问题,请提供更多的信息。
【相关推荐】