60分链式前向星求调
查看原帖
60分链式前向星求调
1021623
AVLw楼主2023/11/13 14:20

思路是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;
}

2023/11/13 14:20
加载中...