#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 感觉没啥问题啊。。