题目链接:https://www.nowcoder.com/acm/contest/157/E

       这道题其实就是求从0到n的最短路,可以用最dij去写,就是初始化的时候需要点改动,剩下的就是模板。用dij写完以后我感觉还能用bfs去写,能走的路都设为1,不能走的都设为0或-1就好了,然后跑一遍bfs,试着交了一发,果然bfs可写...


AC代码(dijkstra):

#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 235
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int pre[maxn][maxn];
 
void init(){
    memset(pre,inf,sizeof(pre));
    for(int i=0;i<n;i++){
        pre[i][i+1] = 1;
        pre[i+1][i] = 1;
    }
}
 
void dijkstra(){
    int Min,flag;
    bool vis[maxn];
    int dis[maxn];
    for(int i=0;i<=n;i++){
        dis[i] = pre[0][i];
        vis[i] = 0;
    }
    for(int i=0;i<=n;i++){
        Min = inf;
        for(int j=0;j<=n;j++){
            if(!vis[j] && dis[j] < Min){
                Min = dis[j];
                flag = j;
            }
        }
        vis[flag] = 1;
        for(int j=0;j<=n;j++){
            if(!vis[j] && dis[j] > dis[flag] + pre[flag][j]){
                dis[j] = dis[flag] + pre[flag][j];
            }
        }
    }
    printf("%d\n",dis[n]);
}
 
int main()
{
    scanf("%d%d",&n,&m);
    init();
    for(int i=0;i<m;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        pre[u][v] = 1;
    }
    dijkstra();
    return 0;
}

AC代码(bfs):

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define maxn 235
#define inf 0x3f3f3f3f
using namespace std;
struct Node{
    int x,step;
}Now,Next,S,E;
int n,m;
int pre[maxn][maxn];
 
void init(){
    memset(pre,-1,sizeof(pre));
    for(int i=0;i<n;i++){
        pre[i][i+1] = 1;
        pre[i+1][i] = 1;
    }
}
 
int bfs(){
    queue<Node> q;
    S.x = 0;
    S.step = 0;
    q.push(S);
    while(!q.empty()){
        Now = q.front();
        q.pop();
        if(Now.x == n){
            return Now.step;
        }
        for(int i=0;i<=n;i++){
            if(pre[Now.x][i] == 1){
                pre[Now.x][i] = -1;
                Next.x = i;
                Next.step = Now.step + 1;
                q.push(Next);
            }
        }
    }
    return -1;
}
 
int main()
{
    scanf("%d%d",&n,&m);
    init();
    for(int i=0;i<m;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        pre[u][v] = 1;
    }
    printf("%d\n",bfs());
    return 0;
}