20pts 只过了 1,2 个点求助
查看原帖
20pts 只过了 1,2 个点求助
335771
cjWYZtql楼主2023/5/14 19:21

如题,拓扑排序 + 邻接表。

#include "bits/stdc++.h"
using namespace std;

queue<int> q;

int ind[1919810], outd[1919810];

struct Edge {
	int to, nxt;
}e[1919810];

int hd[1919810];
int cnt, N, M, ans;

int val[1919810];

void add_edge(int u, int v) {
	++cnt;
	e[cnt].to = v;
	e[cnt].nxt = hd[u];
	hd[u] = cnt;
} 

void Topo() {
	for (int i = 1; i <= N; ++i)
		if (ind[i] == 0) {
			val[i] = 1;
			q.push(i);
		}
	while (!q.empty()) {
		int u, v;
		u = q.front();
		q.pop();
		for (int i = hd[u]; i; i = e[i].nxt) {
			v = e[i].to;
			val[v] = (val[v] + val[u]) % 80012002;
			--ind[v];
			if (ind[v] == 0) q.push(v);
		}
	}
} 

int main() {
	scanf ("%d%d", &N, &M);
	for (int i = 1; i <= M; ++i) {
		int u, v;
		scanf ("%d%d", &u, &v);
		add_edge(u, v);
		++ind[v]; ++outd[u];
	}
	Topo();
	for (int i = 1; i <= N; ++i)
		if (outd[i] == 0) ans = (ans + val[i]) % 80112002;
	cout << ans;
}
2023/5/14 19:21
加载中...