题目链接:http://vjudge.net/contest/141990#problem/B

题意:

给一张有向图G,求一个结点集数最大的结点集,是的该结点集中任意两个结点 u 和 v,满足: 要么 u 能到达 v,要么 v 能到达 u 或者 u 和 v 可以互达 ;

这个和有向强连通图很像,连通方式改了,强连通分量是 任意 两点 之间 都可以互达。可以发现一个强连通分量 ,要么全选,要么全部选。

思路:

把一个强连通分量看成一个结点,这个结点有权值,是他的大小,把每个强连通分量看成一个结点,这样 SCC 图就出来了,SCC图 他是一个有向无环图 DAG。

于是就可以用 dp 来做。

坑点:(数据有可能一个结点都没有)

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

Uva 11324 最大团的更多相关文章

  1. UVa 11324 最大团(强连通分量缩点)

    https://vjudge.net/problem/UVA-11324 题意:给一张有向图G,求一个结点数最大的结点集,使得该结点集中任意两个结点u和v满足,要么u可以到达v,要么v可以达到u. 思 ...

  2. uva 11324 The Largest Clique

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

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

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

  4. 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)

    layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...

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

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

  6. UVA 11324 The Largest Clique(缩点+DAG上的dp)

    求最大团.和等价性证明有类似之处,只不过这个不是求互推,而是只要a->b,或b->a即可. 同样的,容易想到先缩点,得到DAG,每个节点上保存SCC的点数,相信任意一条由根节点(入度为零) ...

  7. UVa 11324 & 强联通分量+DP

    题意: 一张无向图,求点集使其中任意两点可到达. SOL: 强联通分量中的点要么不选要么全都选,然后缩点DAG+DP 记录一下思路,不想写了...代码满天飞.

  8. uva 11324

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

  9. uva 11324 The Largest Clique (Tarjan+记忆化)

    /*每个环 要么不选 要么全选 可缩点 就得到一个GAD图 然后搞搞算出最大路径*/ #include<iostream> #include<cstdio> #include& ...

随机推荐

  1. log4net 配置应用

    (一). WinForm 或者 WPF 中的配置和应用 <?xml version="1.0" encoding="utf-8" ?> <co ...

  2. 关于java多线程

    package testSynchronized; /** * * 当使用this也就是该文件中的testclass对象作为对象锁时, * 两个线程都使用该对象锁访问该对象的同步代码块, * 是顺序执 ...

  3. PHP- 数字转汉字

    //数字转汉字 function number2Chinese($num, $m = 1) { switch($m) { case 0: $CNum = array( array('零','壹','贰 ...

  4. dubbo 试用全过程

    概述: dubbo服务容器是一个standalone的启动程序,因为后台服务不需要Tomcat或JBoss等Web容器的功能,如果硬要用Web容器去加载服务提供方,增加复杂性,也浪费资源. 服务容器只 ...

  5. 蓝牙—RFCOMM协议

    RFCOMM是一个简单的协议,其中针对9针RS-232串口仿真附加了部分条款.可支持在两个蓝牙设备之间同时保持高达60路的通信连接.RFCOMM的目的是针对如何在两个不同设备上的应用之间保证一条完整的 ...

  6. JDBC操作

    String sql = "SELECT * from lib where name = ?";List<Lib> list = getJdbcTemplate().q ...

  7. 移动表格行 解决低版本IE fadeIn fadeOut 失效问题

    在维护一个内部使用的web工具的时候,需要在表格里配置参数,并且支持参数列的上下移动,有jQuery-UI工具支持对表格列的拖动,但是此处不追求效果,而且旧系统页面兼容性很差,无奈只能做上下移动的按钮 ...

  8. C#的默认可访问性级别

    1.在namespace中的类.接口默认是internal类型的,也可以显示的定义为public类型,不允许是其他访问类型.2.在一个类里面,属性和方法默认是private的,可以显示的定义为publ ...

  9. git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree fetch origin

    git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree fetch origi ...

  10. CAShapeLayer(持续更新)

    CAShapeLayer 之前讲过CALayer动画相关知识,再来看看更加复杂的CAShapeLayer相关的动画知识. 普通CALayer在被初始化时是需要给一个frame值的,这个frame值一般 ...