大致题意:给你一个有向无环图,问从任意度数为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;
}