求助!
查看原帖
求助!
643323
weirdoX楼主2023/7/18 17:10
#include <bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i = (int)(l);i <= (int)(r);i++)
#define per(i,r,l) for(int i = (int)(r);i >= (int)(l);i--)
#define pb push_back
#define all(a) a.begin(),a.end()
#define fi first
#define se second
#define mp make_pair
#define SZ(a) (int)(a.size())
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef long long ll;
typedef double db;

const int N = 5000001;
int n, m, d, idx, cnt, top;
int id[100001][51], low[N], dfn[N], val[N], dp[N], bel[N], vis[100001], st[N];
int head[N], tot, ver[N], nxt[N];
VI e[N];
bool open[N], ins[N];

inline void add(const int &u, const int &v) {
	nxt[++tot] = head[u];
	ver[tot] = v;
	head[u] = tot;
}

inline void dfs(const int &u) {
	dfn[u] = low[u] = ++idx;
	ins[u] = true;
	st[++top] = u;
	for (int t = head[u]; t; t = nxt[t]) {
		int v = ver[t];
		if (!dfn[v]) dfs(v);
		if (ins[v]) low[u] = min(low[u], low[v]);
	}
	if (low[u] == dfn[u]) {
		++cnt;
		while (true) {
			int v = st[top--];
			bel[v] = cnt;
			int id = (v + d - 1) / d;
			if (open[v] && vis[id] != cnt) {
				vis[id] = cnt;
				val[cnt]++;
			}
			if (v == u) break;
		}
	}
}

int main() {
	scanf("%d%d%d", &n, &m, &d);
	int tot = 0;
	rep(i,1,n) rep(j,1,d)
		id[i][j] = ++tot;
	while (m--) {
		int u, v;
		scanf("%d%d", &u, &v);
		rep(i,1,d)
			add(id[u][i], id[v][i % d + 1]);
	}
	rep(i,1,n * d)
		scanf("%1d", &open[i]);
	rep(i,1,n * d)
		if (!dfn[i]) dfs(i);
	rep(u,1,n * d)
		for (int t = head[u]; t; t = nxt[t]) {
			int v = ver[t];
			if (bel[u] != bel[v])
				e[bel[u]].pb(bel[v]);
		}
	int ans = 0;
	rep(i,1,cnt) {
		sort(all(e[i]));
		e[i].erase(unique(all(e[i])), e[i].end());
		for (auto j : e[i])
			dp[i] = max(dp[i], dp[j]);
		dp[i] += val[i];
	}
	printf("%d\n", dp[bel[1]]);
	return 0;
}

提交记录 第20个点正确答案64,我的答案66 感觉没啥问题啊。。

2023/7/18 17:10
加载中...