• UVa11324 - The Largest Clique


    Online Judge

    题目大意:有一张n个点m条边的图,现对于每一个点u,建立一条边连接它和所有它能到达的点,问满足所有点之间都有边的分量的大小最大是多少

    0<=n<=1000;0<=m<=50000

    思路:根据建新图的规则可知,一个点会和它能到达的所有点构成一个合法的分量,那么从入度为0的点开始组成的这样一个分量一定是最大的,但是因为图中有环,所以没法直接统计这样的分量的大小,所以要先用tarjan将所有强量通分量缩成一个点,再在新图中用记忆化搜索找上述的分量

    1. //#include<__msvc_all_public_headers.hpp>
    2. #include
    3. using namespace std;
    4. const int N = 1e3 + 5;
    5. int head[N], head2[N];
    6. struct Edge
    7. {
    8. int v, next;
    9. }e[N * N], e2[N * N];
    10. int dfn[N], low[N];
    11. int c1 = 0, c2 = 0;
    12. void addedge(int u, int v)
    13. {//原图
    14. e[++c1].v = v;
    15. e[c1].next = head[u];
    16. head[u] = c1;
    17. }
    18. void addedge2(int u, int v)
    19. {//缩点后的新图
    20. e2[++c2].v = v;
    21. e2[c2].next = head2[u];
    22. head2[u] = c2;
    23. }
    24. bool vis[N];
    25. int cnt = 0;
    26. int ans = 0;
    27. stack<int>s;
    28. int siz[N];
    29. pair<int, int>edge[N * N];
    30. int n, m;
    31. int cnts[N];
    32. int scc[N];
    33. void tarjan(int u)
    34. {//将图拆解成强连通分量的组合
    35. cnt++;//访问次序
    36. dfn[u] = low[u] = cnt;//每个点的访问次序,在第几个强连通分量里
    37. s.push(u);//储存dfs中待处理的点
    38. vis[u] = 1;//在栈内待处理
    39. for (int i = head[u]; ~i; i=e[i].next)
    40. {
    41. int v = e[i].v;
    42. if (!dfn[v])
    43. {//子节点没被访问过
    44. tarjan(v);
    45. low[u] = min(low[u], low[v]);//和子节点合并成一个强连通分量
    46. }
    47. else if (vis[v])
    48. {//重复访问了栈内的节点
    49. low[u] = min(low[u], low[v]);//这两个点一定在一个强连通分量内
    50. }
    51. }
    52. if (dfn[u] == low[u])
    53. {//当前点是这个强连通分量的第一个点,也就是这个分量都已处理完毕
    54. int temp = 0;//记录强连通分量的点数
    55. ans++;//第几个强连通分量
    56. while (!s.empty() && s.top() != u)
    57. {//将这个强量通分量内的点全部弹出
    58. vis[s.top()] = 0;//不在栈内
    59. scc[s.top()] = ans;//每个点属于哪个强连通分量
    60. temp++;
    61. s.pop();
    62. }
    63. temp++;
    64. vis[s.top()] = 0;//第一个点也要弹出
    65. scc[s.top()] = ans;
    66. s.pop();
    67. siz[ans] = temp;//这个连通块里面几个点
    68. }
    69. }
    70. int in[N];
    71. void init()
    72. {
    73. c1 = c2 = 0;
    74. for (int i = 1; i <= n; i++)
    75. {
    76. vis[i] = 0;
    77. dfn[i] = low[i] = siz[i] = 0;
    78. head[i] = head2[i] = -1;
    79. cnts[i] = 0;
    80. in[i] = 0;
    81. }
    82. while (!s.empty())
    83. {
    84. s.pop();
    85. }
    86. cnt = ans = 0;
    87. }
    88. int dfs(int u)
    89. {//记忆化搜索能到达多少个点
    90. if (cnts[u])
    91. {
    92. return cnts[u];
    93. }
    94. int ma = 0;
    95. for (int i = head2[u]; ~i; i=e2[i].next)
    96. {
    97. int v = e2[i].v;
    98. ma = max(ma, dfs(v));//取子节点里面最大的
    99. }
    100. cnts[u] = siz[u] + ma;//这个歌两桶快的大小加子节点传来的值
    101. return cnts[u];
    102. }
    103. void solve()
    104. {
    105. cin >> n >> m;
    106. init();
    107. for (int i = 1; i <= m; i++)
    108. {
    109. int u, v;
    110. cin >> u >> v;
    111. edge[i] = { u,v };
    112. addedge(u, v);
    113. }
    114. for (int i = 1; i <= n; i++)
    115. {
    116. if (!dfn[i])//所有没处理的点都要处理
    117. tarjan(i);
    118. }
    119. for (int i = 1; i <= m; i++)
    120. {
    121. int u = edge[i].first, v = edge[i].second;
    122. if (scc[u] != scc[v])
    123. {//两个点不在一个强连通分块里
    124. addedge2(scc[u], scc[v]);//建新图
    125. in[scc[v]]++;
    126. }
    127. }
    128. int out = 0;
    129. for (int i = 1; i <= n; i++)
    130. {
    131. if (!in[i])
    132. {//从入度为0的点出发开始搜
    133. out = max(out, dfs(i));
    134. }
    135. }
    136. cout << out << '\n';
    137. }
    138. int main()
    139. {
    140. ios::sync_with_stdio(false);
    141. cin.tie(0);
    142. int t;
    143. cin >> t;
    144. while (t--)
    145. {
    146. solve();
    147. }
    148. return 0;
    149. }

  • 相关阅读:
    java毕业设计地铁舆情管理系统Mybatis+系统+数据库+调试部署
    opencv优秀文章集合
    Python-基础学习-第二轮
    中能融合携手天翼云打造“能源大脑”
    golang中的RSA算法,加密解密,签名校验,导出公钥密钥,导入公钥密钥
    基于Matlab计算经典CFAR阈值
    重温历史:Palm OS经典游戏于发布20年后公开源代码
    小众市场:探索跨境电商中的利基领域
    Kotlin中的函数分类(顶层、成员、局部、递归等)
    Web前端:如何提高React原生应用性能
  • 原文地址:https://blog.csdn.net/ashbringer233/article/details/133590782