思路是lines[i]数组存i为终点的条数 Lines走到最后一个位置就是答案ans 60分 2个点wa两个点re 自己搞不明白不知道咋回事 求助。 解决完给大佬回关注
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int N = 1e5 + 10, mod = 80112002;
int ind[N], lines[N];
struct edge {
int v,ne;
}e[N];
int idx=1, h[N];
void add(int a, int b) {
e[idx] = { b,h[a] };
h[a] = idx++;
}
int q[N];
int main() {
memset(h, 0, sizeof(h));
int n, m;
int ans = 0;
int l = 0, r = 0;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
int a, b; //a->b
scanf("%d%d", &a, &b);
add(a, b);
ind[b]++;
}
for (int i = 1; i <= n; i++) {
if (ind[i] == 0) {
q[r++] = i;
lines[i] = 1;
}
}
while (l < r) {
int u = q[l++];
if (h[u] == 0)
ans = (ans + lines[u]) % mod;
else {
for (int i = h[u]; i >0; i = e[i].ne) {
int v = e[i].v;
lines[v] = (lines[v] + lines[u]) % mod;
if (--ind[v] == 0) {
q[r++] = v;
}
}
}
}
printf("%d", ans);
return 0;
}