记录编号 |
514677 |
评测结果 |
AAAAAAAAAAAAAAAA |
题目名称 |
膜拜 |
最终得分 |
100 |
用户昵称 |
jekyll |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.162 s |
提交时间 |
2018-10-17 08:43:52 |
内存使用 |
7.94 MiB |
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
typedef pair<int, int> Pair;
const int maxn = 100005;
int n, m;
int head[maxn], rshead[maxn], shead[maxn], cnt;
struct Edge {
int v, next;
} edge[maxn<<2];
inline void add_edge(int u, int v, int* head) {
edge[++cnt] = (Edge) {v, head[u]};
head[u] = cnt;
}
int scc, timec;
int stk[maxn], instk[maxn], ind;
int color[maxn], sum[maxn], dfn[maxn], low[maxn];
void tarjan(int u, int* head) {
low[u] = dfn[u] = ++timec;
stk[++ind] = u, instk[u] = 1;
for (int i = head[u]; i; i = edge[i].next) {
int v = edge[i].v;
if (!dfn[v])
tarjan(v, head), low[u] = min(low[u], low[v]);
else if (instk[v])
low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
++scc;
do {
sum[scc]++;
color[stk[ind]] = scc;
instk[stk[ind--]] = 0;
} while (stk[ind+1] != u);
}
}
int d[maxn], f[maxn], inque[maxn];
void SPFA(int _s, int* head, int* dis) {
queue<int> que;
for (int i = 1; i <= scc; i++)
dis[i] = 0, inque[i] = 0;
dis[_s] = sum[_s]; que.push(_s);
while (!que.empty()) {
int u = que.front(); que.pop(); inque[u] = 0;
for (int i = head[u]; i; i = edge[i].next) {
int v = edge[i].v;
if (dis[v] < dis[u] + sum[v]) {
dis[v] = dis[u] + sum[v];
if (!inque[v]) que.push(v), inque[v] = 1;
}
}
}
}
void GetSCC(int* head) {
for (int i = 1; i <= n; i++)
if (!dfn[i]) tarjan(i, head);
for (int u = 1; u <= n; u++)
for (int i = head[u]; i; i = edge[i].next) {
int v = edge[i].v;
if (color[u] != color[v])
add_edge(color[u], color[v], shead),
add_edge(color[v], color[u], rshead);
}
}
inline int read() {
int x = 0; char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' && ch <= '9') x = (x<<1) + (x<<3) + (ch^48), ch = getchar();
return x;
}
int main() {
freopen("OrzOrz.in", "r", stdin);
freopen("OrzOrz.out", "w", stdout);
n = read(), m = read();
for (int i = 1, a, b; i <= m; i++)
a = read(), b = read(), add_edge(a, b, head);
GetSCC(head);
SPFA(color[1], shead, d);
SPFA(color[1], rshead, f);
int ans = 0;
for (int u = 1; u <= scc; u++)
for (int i = shead[u]; i; i = edge[i].next) {
int v = edge[i].v;
if (d[v] && f[u]) ans = max(ans, d[v] + f[u]);
}
if (ans != sum[color[1]]) ans -= sum[color[1]];
cout << ans << '\n';
fclose(stdin), fclose(stdout);
return 0;
}