给出一个有向图,求一个最大的结点集合,任意两个点u,v。u可到达v或v可到达u。

一个强连通分量肯定一起选的。而且只能在一条路径上。

所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG上的dp。

注意0,0这组数据

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = ,maxm = 5e5+;
  5.  
  6. int head[maxn],to[maxm],nxt[maxm];
  7.  
  8. void addEdge(int u,int v,int i)
  9. {
  10. to[i] = v;
  11. nxt[i] = head[u];
  12. head[u] = i;
  13. }
  14.  
  15. int pre[maxn],low[maxn],sccno[maxn],dfs_clock,scc_cnt;
  16. stack<int> stk;
  17.  
  18. void tarjan(int u)
  19. {
  20. pre[u] = low[u] = ++dfs_clock;
  21. stk.push(u);
  22. for(int i = head[u]; ~i; i = nxt[i]){
  23. int v = to[i];
  24. if(!pre[v]){
  25. tarjan(v);
  26. low[u] = min(low[u],low[v]);
  27. }else if(!sccno[v]){
  28. low[u] = min(low[u],pre[v]);
  29. }
  30. }
  31. if(pre[u] == low[u]){
  32. scc_cnt++;
  33. while(stk.size()){
  34. int x = stk.top(); stk.pop();
  35. sccno[x] = scc_cnt;
  36. if(x == u) break;
  37. }
  38. }
  39. }
  40.  
  41. void find_scc(int n)
  42. {
  43. memset(pre,,sizeof(pre));
  44. memset(sccno,,sizeof(sccno));
  45. dfs_clock = scc_cnt = ;
  46. for(int i = ; i < n; i++){
  47. if(!pre[i]) tarjan(i);
  48. }
  49. }
  50.  
  51. vector<int> G[maxn];
  52. int wei[maxn], deg[maxn];
  53.  
  54. void buildDAG(int n)
  55. {
  56. for(int i = ; i <= scc_cnt; i++) G[i].clear(),deg[i] = wei[i] = ;
  57. for(int u = ; u < n; u++){
  58. int v0 = sccno[u]; wei[v0]++;
  59. for(int i = head[u]; ~i; i = nxt[i]){
  60. int v1 = sccno[to[i]];
  61. if(v0 != v1) G[v0].push_back(v1),deg[v1]++;
  62. }
  63. }
  64. }
  65.  
  66. int dp[maxn];
  67. int topo()
  68. {
  69. memset(dp,-,sizeof(dp));
  70. queue<int> q;
  71. for(int i = ; i <= scc_cnt; i++){
  72. if(!deg[i]) q.push(i),dp[i] = wei[i];
  73. }
  74. while(q.size()){
  75. int u = q.front(); q.pop();
  76. for(int i = ; i < (int)G[u].size(); i++){
  77. int v = G[u][i];
  78. dp[v] = max(dp[v],dp[u]+wei[v]);
  79. if(--deg[v] == ) q.push(v);
  80. }
  81. }
  82. int ans = ;
  83. for(int i = ; i <= scc_cnt; i++){
  84. ans = max(dp[i],ans);
  85. }
  86. return ans;
  87. }
  88.  
  89. int main()
  90. {
  91. //freopen("in.txt","r",stdin);
  92. int T; scanf("%d",&T);
  93. while(T--){
  94. int n,m;
  95. memset(head,-,sizeof(head));
  96. scanf("%d%d",&n,&m);
  97. for(int i = ; i < m; i++){
  98. int u,v; scanf("%d%d",&u,&v);
  99. addEdge(u-,v-,i);
  100. }
  101. find_scc(n);
  102. buildDAG(n);
  103. printf("%d\n",topo());
  104. }
  105. return ;
  106. }

UVA 11324 The Largest Clique (强连通分量,dp)的更多相关文章

  1. UVa 11324 The Largest Clique (强连通分量+DP)

    题意:给定一个有向图,求一个最大的结点集,使得任意两个结点,要么 u 能到 v,要么 v 到u. 析:首先,如果是同一个连通分量,那么要么全选,要么全不选,然后我们就可以先把强连通分量先求出来,然后缩 ...

  2. UVA 11324 The Largest Clique(强连通分量+缩点DAG的DP)

    题意:给定一个有向图,求出一个最大的结点集,这个节点集中的随意两个点之间至少一个能到达还有一个点. 思路:假设一个点在这个节点集中,那么它所在的强连通分量中的点一定所有在这个节点集中,反之亦然, 求出 ...

  3. uva 11324 The Largest Clique(强连通分量缩点+DAG动态规划)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=sh ...

  4. UVA - 11324 The Largest Clique 强连通缩点+记忆化dp

    题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...

  5. UVA - 11324 The Largest Clique (强连通缩点+dp)

    题目链接 题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u. 解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可. 感觉 ...

  6. UVA 11324 - The Largest Clique(强连通分量+缩点)

    UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分 ...

  7. UVA11324 The Largest Clique[强连通分量 缩点 DP]

    UVA - 11324 The Largest Clique 题意:求一个节点数最大的节点集,使任意两个节点至少从一个可以到另一个 同一个SCC要选一定全选 求SCC 缩点建一个新图得到一个DAG,直 ...

  8. UVA11324 The Largest Clique —— 强连通分量 + 缩点 + DP

    题目链接:https://vjudge.net/problem/UVA-11324 题解: 题意:给出一张有向图,求一个结点数最大的结点集,使得任意两个结点u.v,要么u能到达v, 要么v能到达u(u ...

  9. uva 11324 The Largest Clique

    vjudge 上题目链接:uva 11324 scc + dp,根据大白书上的思路:" 同一个强连通分量中的点要么都选,要么不选.把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它 ...

随机推荐

  1. Flutter实战视频-移动电商-05.Dio基础_引入和简单的Get请求

    05.Dio基础_引入和简单的Get请求 博客地址: https://jspang.com/post/FlutterShop.html#toc-4c7 第三方的http请求库叫做Dio https:/ ...

  2. 爬虫代码实现六-Queue队列实现循环抓取

    StartDSJCount : package com.dajiangtai.djt_spider.start; import java.util.List;import java.util.Queu ...

  3. PHP实用小程序(一)

    <? //设置路径(默认当前php文件所在路径) $basedir = "d:/inetpub/wwwroot"; $textrows = "20"; $ ...

  4. 两个MATLAB在线工具,画图啥的都不用安装了

    1. matlab网页版 http://octave-online.net/ http://www.compileonline.com/execute_matlab_online.php   2. 函 ...

  5. POJ 3067【树状数组】

    题意: 给你两行数字,n个m个,然后给你k条线直接把两个数连起来,问有多少个交叉的 思路: 假定上一行是起点,下一行是终点. 把路按照起点从大到下排序, 然后可以直接对每条路查询,这条路目前的交叉数, ...

  6. [Xcode 实际操作]一、博主领进门-(15)读取当前应用的信息

    目录:[Swift]Xcode实际操作 本文将演示读取当前应用的配置信息. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class V ...

  7. 调用Web API将文件上传到服务器的方法(.Net Core)

    最近遇到一个将Excel通过Web API存到服务器的问题,其中涉及到Excel的读取.调用API.Web  API怎么进行接收. 一. Excel的读取.调用API Excel读取以及调用API的代 ...

  8. seq(2018.10.24)

    一道\(dp\)题... 期望\(40\)分解法 预处理:离散化,然后让连续一段值相同的元素合并为一个元素. 正式\(DP\): 显然有个最差策略为每个元素处都切一次,则切的次数为元素的个数\(-1\ ...

  9. python异常之ModuleNotFoundError: No module named 'test01inner02'

    当我们使用sys.path.append(args) 指令向程序中导入模块时其实本次append操作只是在内存中完成的,如果要永久性的添加需要修改环境变量. 我们发现当我们使用print(sys.pa ...

  10. 25 Groovy 相关资料

    Groovy Homepage Groovy API page Groovy documentation Groovy Goodness blog series from Hubert Klein I ...