图论

大致题意:给你一个有向无环图,问从任意度数为0的节点出发到达节点n的最短路(边长为1)

解法:
首先看到是一个有向无环图,再看到选了课程A之后才能选课程B,第一反应是拓扑排序之后dfs,但是拓扑排序的结果不会唯一,因此工作量会很大,会T,之后看到题解之后发现倒着一遍bfs即可。
Bfs过程中,当遍历到一个顶点的时候,如果这个结点没有出度,即没有节点与之相邻,便可以退出。
容易WA的点在于初始时的深度应该为1而不是0.

#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
const int maxn = 200000+5;
struct node {
    int deep, id;
    //node(int deep, int id) :deep(deep), id(id) {}
};
vector<int>g[maxn];
queue<node>q;
int visit[maxn];
int m, n, k;

int main() {
    scanf("%d%d%d", &n, &k, &m);
    int a, b;
    long long ans;
    for (int i = 0; i < m; i++) {
        scanf("%d%d", &a, &b);
        g[b].push_back(a);
    }
    //memset(visit, 0, sizeof(visit));
    node n ;
    n.id = k; n.deep = 1;
    q.push(n);
    visit[k] = 1;
    while (!q.empty()) {
        node now = q.front(); q.pop();
        int sz = g[now.id].size();
        if (sz == 0) { ans = now.deep; break; }
        node ne;
        ne.deep = now.deep + 1;
        for (int i = 0; i < sz; i++) {
            if (visit[g[now.id][i]] == 0) {
                ne.id = g[now.id][i];
                q.push(ne);
                visit[g[now.id][i]] = 1;
            }
        }
    }
    printf("%lld
", ans);
    return 0;
}
原文地址:https://www.cnblogs.com/romaLzhih/p/9489846.html