问题标题: 酷町堂:1595升降机

0
0

2
已采纳
陆麟瑞
陆麟瑞
资深天翼
资深天翼

这道题可以用图论写,也可以用dfs写,我用的是图论。

这是一道最短路的问题,因此我用了弗洛伊德。

一开始读入。

for i:=1 to n do
 begin
        if i+a[i]<=n then begin  f[i,i+a[i]]:=1; end;//建一个邻接矩阵
        if i-a[i]>0 then begin  f[i,i-a[i]]:=1; end;//同样建一个邻接矩阵
 end;
for i:=1 to n do
 for j:=1 to n do
 for k:=1 to n do
 if(i<>j)and(k<>j)and(k<>i)and(f[j,i]+f[i,k]<f[j,k]) then f[j,k]:=f[j,i]+f[i,k];//弗洛伊德大法好
if f[c,b]>100000 then writeln(-1) else writeln(f[c,b]);//最后判断

注意!!!f数组一开始要付很大,就像这样:

 fillchar(f,sizeof(f),10000);
1
1
1
1
杨舰中
杨舰中
高级守护
高级守护
定义 n,a,b;
    cin>>n>>a>>b;
    for (int i=1;i<=n;++i)



    {



        for (int j=1;j<=n;++j)



          d[i][j]=1000000;



        d[i][i]=0;



}



    int k;



    for (int i=1;i<=n;++i)



    {



        scanf("%d",&k);



        if (i+k<=n) d[i][i+k]=1;



        if (i-k>=1) d[i][i-k]=1;



}



    for (int i=1;i<=n;++i)



dis[i]=d[a][i];



    int minn,t;



    for (int i=1;i<=n;++i)



    {



        minn=1000000;



        for (int j=1;j<=n;++j)



          if (f[j]==0&&dis[j]<minn)



          {



              minn=dis[j];



              t=j;



          }



        f[t]=1;



        for (int j=1;j<=n;++j)



          dis[j]=min(dis[j],dis[t]+d[t][j]);



}



    if (dis[b]!=1000000)



      cout<<dis[b];



    else



      cout<<-1;

 

1
1
1
1
1
李泽远
李泽远
高级天翼
高级天翼

对,就像他们所说的。

1
1
0
0
我要回答