记录编号 514677 评测结果 AAAAAAAAAAAAAAAA
题目名称 膜拜 最终得分 100
用户昵称 Gravatarjekyll 是否通过 通过
代码语言 C++ 运行时间 0.162 s
提交时间 2018-10-17 08:43:52 内存使用 7.94 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<iostream>
  3. #include<queue>
  4. using namespace std;
  5. typedef pair<int, int> Pair;
  6. const int maxn = 100005;
  7. int n, m;
  8. int head[maxn], rshead[maxn], shead[maxn], cnt;
  9. struct Edge {
  10. int v, next;
  11. } edge[maxn<<2];
  12. inline void add_edge(int u, int v, int* head) {
  13. edge[++cnt] = (Edge) {v, head[u]};
  14. head[u] = cnt;
  15. }
  16. int scc, timec;
  17. int stk[maxn], instk[maxn], ind;
  18. int color[maxn], sum[maxn], dfn[maxn], low[maxn];
  19. void tarjan(int u, int* head) {
  20. low[u] = dfn[u] = ++timec;
  21. stk[++ind] = u, instk[u] = 1;
  22. for (int i = head[u]; i; i = edge[i].next) {
  23. int v = edge[i].v;
  24. if (!dfn[v])
  25. tarjan(v, head), low[u] = min(low[u], low[v]);
  26. else if (instk[v])
  27. low[u] = min(low[u], dfn[v]);
  28. }
  29. if (low[u] == dfn[u]) {
  30. ++scc;
  31. do {
  32. sum[scc]++;
  33. color[stk[ind]] = scc;
  34. instk[stk[ind--]] = 0;
  35. } while (stk[ind+1] != u);
  36. }
  37. }
  38. int d[maxn], f[maxn], inque[maxn];
  39. void SPFA(int _s, int* head, int* dis) {
  40. queue<int> que;
  41. for (int i = 1; i <= scc; i++)
  42. dis[i] = 0, inque[i] = 0;
  43. dis[_s] = sum[_s]; que.push(_s);
  44. while (!que.empty()) {
  45. int u = que.front(); que.pop(); inque[u] = 0;
  46. for (int i = head[u]; i; i = edge[i].next) {
  47. int v = edge[i].v;
  48. if (dis[v] < dis[u] + sum[v]) {
  49. dis[v] = dis[u] + sum[v];
  50. if (!inque[v]) que.push(v), inque[v] = 1;
  51. }
  52. }
  53. }
  54. }
  55. void GetSCC(int* head) {
  56. for (int i = 1; i <= n; i++)
  57. if (!dfn[i]) tarjan(i, head);
  58. for (int u = 1; u <= n; u++)
  59. for (int i = head[u]; i; i = edge[i].next) {
  60. int v = edge[i].v;
  61. if (color[u] != color[v])
  62. add_edge(color[u], color[v], shead),
  63. add_edge(color[v], color[u], rshead);
  64. }
  65. }
  66. inline int read() {
  67. int x = 0; char ch = getchar();
  68. while (ch < '0' || ch > '9') ch = getchar();
  69. while (ch >= '0' && ch <= '9') x = (x<<1) + (x<<3) + (ch^48), ch = getchar();
  70. return x;
  71. }
  72. int main() {
  73. freopen("OrzOrz.in", "r", stdin);
  74. freopen("OrzOrz.out", "w", stdout);
  75.  
  76. n = read(), m = read();
  77. for (int i = 1, a, b; i <= m; i++)
  78. a = read(), b = read(), add_edge(a, b, head);
  79.  
  80. GetSCC(head);
  81. SPFA(color[1], shead, d);
  82. SPFA(color[1], rshead, f);
  83.  
  84. int ans = 0;
  85. for (int u = 1; u <= scc; u++)
  86. for (int i = shead[u]; i; i = edge[i].next) {
  87. int v = edge[i].v;
  88. if (d[v] && f[u]) ans = max(ans, d[v] + f[u]);
  89. }
  90. if (ans != sum[color[1]]) ans -= sum[color[1]];
  91. cout << ans << '\n';
  92.  
  93. fclose(stdin), fclose(stdout);
  94. return 0;
  95. }