欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

牛客练习赛24E——青蛙

程序员文章站 2022-07-07 20:22:14
...

链接:https://www.nowcoder.com/acm/contest/157/E
来源:牛客网
题目描述
有一只可爱的老青蛙,在路的另一端发现了一个黑的东西,想过去一探究竟。于是便开始踏上了旅途
一直这个小路上有很多的隧道,从隧道的a进入,会从b出来,但是隧道不可以反向走。
这只青蛙因为太老了,所以很懒,现在想请你帮帮慢,问他最少需要几步才可以到达对面。
将小径看作一条数轴,青蛙初始在0上,这只青蛙可以向前跳也可以向后跳,但每次只能跳一格,每跳一格记作一步,从隧道进到隧道出算做一步。
输入描述:
第一行两个数m,n;表示黑色物品在数轴m点上,数轴上总共有n个隧道
接下来n行,每行a,b两个数,表示从a进会从b出
10 <= m,n <= 233
0<a,b<=m

输出描述:
一个数ans表示最小步数
示例1
输入
复制
16 4
2 10
8 15
12 5
13 6
输出
复制
7
说明
0–>1–>2–>10–>9–>8–>15–>16
牛客练习赛24E——青蛙

刚开始以为是dp,d不出来,然后觉得应该是dfs,也d不出来,中间发现忘记可以往回走这种情况还一度以为能过,结果发现这不就是一个0到m的最短路嘛,直接dijkstra模板抄一抄,改一改,就过了……

代码:

#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
const int MAXN=1010;
const int INF=0x3f3f3f3f;
bool vis[MAXN];
int cost[MAXN][MAXN];
int lowcost[MAXN];
int n;
int m;
int u,v,c;
int s,e;
void Dijkstra(int s){
    for(int i=0;i<=n;i++){
        lowcost[i]=INF;
        vis[i]=false;
    }
    lowcost[s]=0;
    for(int i=0;i<=n;i++){
        int k=-1;
        int Min=INF;
        for(int j=0;j<=n;j++){
            if(!vis[j] && lowcost[j]<Min){
                Min=lowcost[j];
                k=j;
            }
        }
        if(k==-1){
            break;
        }
        vis[k]=true;
        for(int j=0;j<=n;j++){
            if(!vis[j] && lowcost[k]+cost[k][j]<lowcost[j]){
                lowcost[j]=lowcost[k]+cost[k][j];
            }
        }
    }
}
int main(void){
    scanf("%d%d",&n,&m);
    memset(cost,INF,sizeof(cost));
    for(int i=0;i<m;i++){
        scanf("%d%d",&u,&v);
        cost[u][v]=1;
    }
    for(int i=0;i<n;i++){
        cost[i][i+1]=1;
        cost[i+1][i]=1;
    }
    Dijkstra(0);
    printf("%d\n",lowcost[n]);
    return 0;
}