求最大团。和等价性证明有类似之处,只不过这个不是求互推,而是只要a->b,或b->a即可。

同样的,容易想到先缩点,得到DAG,每个节点上保存SCC的点数,相信任意一条由根节点(入度为零)出发的路径中权值和最大的即为所求,dp即可解决。

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stack>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. const int MAXN=;
  8. const int MAXM=;
  9.  
  10. struct Edge{
  11. int v,next;
  12. }edge[MAXM];
  13.  
  14. stack<int >stk;
  15. int head[MAXN],tol;
  16. int low[MAXN],pre[MAXN],sccno[MAXN],scc_cnt,TT,sccnum[MAXN];
  17. int dp[MAXN];
  18.  
  19. void init()
  20. {
  21. tol=;
  22. memset(head,-,sizeof(head));
  23. }
  24.  
  25. void add(int u,int v)
  26. {
  27. edge[tol].v=v;
  28. edge[tol].next=head[u];
  29. head[u]=tol++;
  30. }
  31.  
  32. void dfs(int u)
  33. {
  34. int v;
  35. low[u]=pre[u]=++TT;
  36. stk.push(u);
  37. for(int i=head[u];i!=-;i=edge[i].next)
  38. {
  39. v=edge[i].v;
  40. if(!pre[v]){
  41. dfs(v);
  42. low[u]=min(low[u],low[v]);
  43. }else if(!sccno[v])
  44. low[u]=min(low[u],pre[v]);
  45. }
  46. if(low[u]==pre[u]){
  47. scc_cnt++;
  48. int s=;
  49. do{
  50. v=stk.top();
  51. stk.pop();
  52. sccno[v]=scc_cnt;
  53. s++;
  54. }while(u!=v);
  55. sccnum[scc_cnt]=s;
  56. }
  57. }
  58.  
  59. void tarjan(int n)
  60. {
  61. scc_cnt=TT=;
  62. memset(low,,sizeof(low));
  63. memset(pre,,sizeof(pre));
  64. memset(sccno,,sizeof(sccno));
  65.  
  66. for(int i=;i<=n;i++)
  67. if(!pre[i])
  68. dfs(i);
  69. }
  70.  
  71. int find_dfs(int u){
  72. if(dp[u])
  73. return dp[u];
  74. else if(head[u]==-)
  75. return dp[u]=sccnum[u];
  76.  
  77. int m=;
  78. for(int i=head[u];i!=-;i=edge[i].next)
  79. {
  80. int v=edge[i].v;
  81. m=max(m,find_dfs(v));
  82. }
  83. return dp[u]=sccnum[u]+m;
  84. }
  85.  
  86. int main()
  87. {
  88. int T,n,m;
  89. int a[MAXM],b[MAXM];
  90. int in[MAXN];
  91. scanf("%d",&T);
  92. while(T--)
  93. {
  94. scanf("%d%d",&n,&m);
  95.  
  96. init();
  97. for(int i=;i<=m;i++)
  98. {
  99. scanf("%d%d",&a[i],&b[i]);
  100. add(a[i],b[i]);
  101. }
  102. tarjan(n);
  103.  
  104. init();
  105. memset(in,,sizeof(in));
  106. for(int i=;i<=m;i++)
  107. {
  108. if(sccno[a[i]]!=sccno[b[i]]){
  109. in[sccno[b[i]]]++;
  110. add(sccno[a[i]],sccno[b[i]]);
  111. }
  112. }
  113. int s=;
  114. memset(dp,,sizeof(dp));
  115. for(int i=;i<=scc_cnt;i++)
  116. if(!in[i])
  117. s=max(s,find_dfs(i));
  118. printf("%d\n",s);
  119. }
  120. return ;
  121. }

UVA 11324 The Largest Clique(缩点+DAG上的dp)的更多相关文章

  1. Uva 11324 The Largest Clique【强连通 DAG动规 spfa】

    白书上的例题 做一遍tarjan后,缩点,每一个scc节点的权为它的结点数,做一次DAG上的动规,求出路径上的最大点权和,就可以了 #include<cstdio> #include< ...

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

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

  3. UVA 11324 The Largest Clique (强连通分量,dp)

    给出一个有向图,求一个最大的结点集合,任意两个点u,v.u可到达v或v可到达u. 一个强连通分量肯定一起选的.而且只能在一条路径上. 所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG ...

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

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

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

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

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

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

  7. uva 11324 The Largest Clique

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

  8. uva 11324 The Largest Clique(图论-tarjan,动态规划)

    Problem B: The Largest Clique Given a directed graph G, consider the following transformation. First ...

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

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

随机推荐

  1. Response响应工具类

    技术交流群: 233513714 import com.google.common.base.Objects; import java.io.Serializable; public class Re ...

  2. nohup 重定向的问题-- 费元星 站长

    费元星 大牛 以前只知道使用nohup可以让一个程序后台执行,但是生成的日志文件都放到nohup.out中了,不能自己指定,尤其是在同一个目录下我需要让两个甚至多个程序都要后台执行时,这样看日志就比较 ...

  3. NGUI-Tweens

    Tweens(补间动画) 补间动画有很多种: 这里以Tween Height为例: 项目层次: btn为一个按钮,group为一组图片精灵,预览图如下: 第一步:先为每个item附加一个Tween H ...

  4. sql 游标使用

    declare @PASSDate datetime,@VLPN varchar(50),@VLPNColor varchar(10),@nambers int set @VLPN='';set @V ...

  5. 参加2018之江杯全球人工智能大赛
:视频识别&问答

    学习了一段时间的AI,用天池大赛来检验一下自己的学习成果. 题目:参赛者需对给定的短视频进行内容识别和分析,并回答每一个视频对应的问题.细节请到阿里天池搜索. 两种思路 1 将视频截成一帧一帧的图片, ...

  6. linux c编程(一)

    1 常用系统环境配置 2 使用g++编译连接,使用gdb调试 3 使用makefile组织目标文件的依赖关系 4 使用git 1 常用系统环境配置 输入法 Download setup file fo ...

  7. GCC特性之__init修饰解析 - kasalyn的专栏 - 博客频道 - CSDN.NET

    , GCC特性之__init修饰解析 - kasalyn的专栏 - 博客频道 - CSDN.NET.MathJax_Hover_Frame {border-radius: .25em; -webkit ...

  8. BETA(1)

    目录 组员情况 组员1(组长):胡绪佩 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团 ...

  9. cfq调度器

    cfq调度是block层最复杂的一个调度器,主要思想是是说每个进程平均享用IO带宽,实现方法是在时间上对进程进行划分,以此达到平均占用IO的目的.带着几个问题去看cfq 1)现在进程来了之后,是插入到 ...

  10. EXTJS4.0 grid 可编辑模式 配置

    首先配置这个参数 plugins:[//插件 Ext.create("Ext.grid.plugin.CellEditing",{ clicksToEdit:1//单元格 点一下就 ...