小清新缩点 dp 求助
查看原帖
小清新缩点 dp 求助
519384
Link_Cut_Y楼主2023/11/16 15:51
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#define rep(i, a, b) for (int i = (a); i <= (b); i ++ )

#define all(x) x.begin(), x.end()
#define pb push_back
#define ls (u << 1)
#define gc getchar
#define pc putchar
#define db double
#define y second
#define x first

using namespace std;

int qpow(int a, int b = mod - 2) {
	int ans = 1; for (; b; b >>= 1, a = 1ll * a * a % mod)
		if (b & 1) ans = 1ll * ans * a % mod; return ans;
}
void read() { return; }
template <typename T, typename ...T2>
void read(T &s, T2 &...oth) {
	s = 0; char ch = gc(); bool f = 0;
	for (; ch < '0' or ch > '9'; ch = gc()) if (ch == '-') f = 1;
	for (; ch >= '0' and ch <= '9'; ch = gc()) s = (s << 1) + (s << 3) + (ch ^ 48);
	s = f ? -s : s; read(oth...); return;
}
void write(char ch) { return; }
template <typename T, typename ...T2>
void write(char ch, T s, T2 ...oth) {
	if (!s) { pc('0'); pc(ch); write(ch, oth...); return; }
	int stk[100], top = 0;
	if (s < 0) pc('-'), s = ~s + 1;
	while (s) stk[ ++ top] = s % 10, s /= 10;
	do pc(stk[top -- ] + (1 << 4) + (1 << 5)); while (top);
	pc(ch); write(ch, oth...); return;
}

const int N = 1000010;
int h[N], e[N], ne[N], idx, b[N], m;
int dfn[N], sz[N], tsp, cnt, a[N], n;
int id[N], low[N], stk[N], top, f[N];
vector<int> vec[N];
bool st[N];

void add(int a, int b) {
	e[ ++ idx] = b, ne[idx] = h[a], h[a] = idx;
}
void tarjan(int u) {
	dfn[u] = low[u] = ++ tsp;
	stk[ ++ top] = u, st[u] = 1;
	for (int i = h[u]; i; i = ne[i]) {
		int v = e[i]; if (!dfn[v]) {
			tarjan(v); low[u] = min(low[u], low[v]);
		} else if (st[v]) low[u] = min(low[u], low[v]);
	} if (low[u] == dfn[u]) {
		int y; ++ cnt;
		do {
			y = stk[top -- ]; st[y] = 0;
			id[y] = cnt, sz[cnt] ++ ;
			vec[cnt].pb(y);
		} while (y != u);
	}
}
int dfs(int u) {
	if (f[u]) return f[u];
	for (int i = h[u]; i; i = ne[i]) {
		int v = e[i];
		f[u] = min(36501, dfs(v) + f[u]);
	} return f[u];
}
int main() {
	read(n, m);
	rep(i, 1, m) read(a[i], b[i]);
	rep(i, 1, m) add(a[i], b[i]);
	rep(i, 1, n + 1) if (!dfn[i]) tarjan(i);
	rep(i, 1, n + 1) h[i] = 0; idx = 0;
	rep(i, 1, m) if (id[a[i]] ^ id[b[i]])
		add(id[a[i]], id[b[i]]);
	rep(i, 1, cnt) if (sz[i] > 1) f[i] = 36501;
	rep(i, 1, m) if (a[i] == b[i]) f[id[a[i]]] = 36501;
	if (!f[id[n + 1]]) f[id[n + 1]] = 1; int mx = 0;
	rep(i, 1, cnt) if (!f[i]) dfs(i);
	rep(i, 1, cnt) mx = max(mx, f[i]);
	if (mx == 36501) puts("zawsze");
	else printf("%d\n", mx); vector<int> ans;
	rep(i, 1, cnt) if (f[i] == mx) {
		for (int j : vec[i]) ans.pb(j);
	} printf("%d\n", (int)ans.size());
	sort(all(ans)); for (int i : ans) 
		if (i != n + 1) printf("%d\n", i);
}
2023/11/16 15:51
加载中...