走路

 

Sample Input

6 6 
1 3 
2 6 
3 6 
3 2 
6 4 
4 5

Sample Output
1<=n,m<1000

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
const int N = 1e5 + 10;
int h[N], n, m, tot;
int a, b;

struct node {
    int v, c, ne;
} e[N];

void add(int u, int v, int c) {
    tot++;
    e[tot] = (node) {
        v, c, h[u]
    };
    h[u] = tot;
}

int ff, rr, d[N], v[N], zz, l;
queue<int>q;

void spfa() {
    q.push(1);
    v[1] = 1;
    memset(d, 24, sizeof(d));
    d[1] = 0;
    while (!q.empty()) {
        ff = q.front();
        q.pop();
        v[ff] = 0;
        for (int i = h[ff]; i; i = e[i].ne) {
            rr = e[i].v;
            if (d[rr] > d[ff] + e[i].c) {
                d[rr] = d[ff] + e[i].c;
                if (!v[rr])
                    v[rr] = 1, q.push(rr);
            }
        }
    }
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1, k; i <= m; ++i) {
        scanf("%d%d", &a, &b);
        add(a, b, 1);
    }
    spfa();
    cout << d[n];
    return 0;
}
代码
还是一道最短路模板题,此为SPFA代码
posted @ 2021-02-03 21:37  月亮茶  阅读(77)  评论(0编辑  收藏  举报