D - 邱老师的脑残粉

Time Limit: 12000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

邱老师的粉丝众多,每天邱老师都得面对粉丝们数不尽的邀约,邱老师一个人处理不过来,所以想请你帮忙。

假设某天有N个粉丝想和邱老师约,一旦某个粉丝成功地约上了邱老师,她就会发微博和朋友炫耀。一旦某个粉丝发现微博里有关于邱老师的消息,她都会转发。

如果当天内某个约上邱老师的粉丝发现微博里有其他粉丝和邱老师约会的消息,她就会很难堪,邱老师也会很难堪(显得邱老师不够专一)。为了避免这种尴尬的情况发生,邱老师每天只能从N个粉丝里选择一部分应约。

但是邱老师为了满足更多粉丝的愿望,邱老师能够从约会的粉丝中至多选择两名粉丝,迷惑她(们)当天停止使用微博(既不查看消息,也不转发消息),这样子能和邱老师约会的粉丝好像又变多了。但是选择哪两名粉丝才能使得能和邱老师约会的粉丝的数量达到最大?

Input

第一行两个整数N,M,表示当天有N个粉丝想和邱老师约会以及粉丝之间有M条关系。(1≤N,M≤5000)

接下来M行,每行表示两个数u,v表示第u个粉丝和第v个粉丝的微博是相互关注的。(1≤u,v≤N)

(相互关注指的是:u发的消息v都能看到,v发的消息u都能看到)

数据保证没有重边和自环

Output

输出邱老师当天最多能和多少个粉丝约会。

Sample input and output

Sample Input Sample Output
  1. 5 4
  2. 1 2
  3. 1 3
  4. 1 4
  5. 4 5
  1. 5

Hint

样例中,如果不迷惑粉丝的话,邱老师当天只能和1个粉丝约会(比如和2号粉丝约会),因为2号粉丝会发微博炫耀,1号粉丝看到后会转发,这样3号粉丝和4号粉丝看到1号的转发也会转发,这样5号粉丝也从4号粉丝那里看到了2号发的微博。

但是如果邱老师迷惑1号粉丝和4号粉丝让她俩当天停止使用微博的话,邱老师当天就能和5个粉丝约会辣!

解题报告:

本题的数据很水,本题的数据很水,本题的数据很水,重要的事情说三遍,各位可以尝试二次直接贪,可2ms左右过

本题是一道tarjan算法题目.

首先我们第一个点需要枚举,why?考虑下面这种情况:

这个图既是边双连通,又是点双连通,第一个取的点程序是无法判断哪个更优的.

所以我们第一个点采用枚举的形式.

那么第二个点呢?

注意到第二个点之后我们并不能继续操作,所以第二点的选取我们用贪心.

这样,算法框架就出来了:

  1. 枚举每个可能的第一个点
  2. 对切割这个点后的图跑tarjan,这里我采用的是割桥,若u – v是割桥,则val[u] ++ , val[v] ++
  3. 我们去掉val值最大的点,然后跑一次连通分量,并更新答案

复杂度: O ( n * ( n + m ) * 2 )

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <vector>
  6. #define pb push_back
  7. using namespace std;
  8. const int maxn = 5e3 + ;
  9. vector<int>E[maxn];
  10. int n,m,T,new_time[maxn],low[maxn];
  11. int is_cut[maxn] , cut_vertx1 , cut_vertx2 , ans = ,ptr;
  12. bool vis[maxn]; //染色集合
  13.  
  14. int tarjan_dfs(int cur,int pre)
  15. {
  16. new_time[cur] = low[cur] = T++;
  17. for(int i = ; i < E[cur].size() ; ++ i)
  18. {
  19. int nextnode = E[cur][i];
  20. if (nextnode == cut_vertx1) continue; //枚举的第一次去掉的点
  21. ptr = cur;
  22. if (!new_time[nextnode]) //树边
  23. {
  24. int lowv = tarjan_dfs(nextnode,cur);
  25. if (lowv > new_time[cur])
  26. {
  27. is_cut[cur] ++ , is_cut[nextnode] ++ ;
  28. }
  29. low[cur] = min(low[cur],lowv);
  30. }
  31. else if (new_time[nextnode] < new_time[cur] && nextnode != pre) //反向边
  32. low[cur] = min(low[cur],new_time[nextnode]);
  33. }
  34. return low[cur];
  35. }
  36.  
  37. void colour_map(int cur)
  38. {
  39. vis[cur] = true;
  40. for(int i = ; i < E[cur].size() ; ++ i)
  41. {
  42. int nextnode = E[cur][i];
  43. if (!vis[nextnode] && nextnode != cut_vertx1 && nextnode != cut_vertx2)
  44. colour_map(nextnode);
  45. }
  46. }
  47.  
  48. void updata_ans(int x,int y)
  49. {
  50. cut_vertx1 = x , cut_vertx2 = y;
  51. int tot = ;
  52. memset(vis,false,sizeof(vis));
  53. for(int i = ; i <= n ; ++ i)
  54. if (!vis[i])
  55. {
  56. if (i != cut_vertx1 && i != cut_vertx2)
  57. colour_map(i);
  58. tot++;
  59. }
  60. ans = max(ans,tot);
  61. }
  62.  
  63. void slove()
  64. {
  65. for(int tt = ; tt <= n ; ++ tt)
  66. {
  67. cut_vertx1 = tt;
  68. memset(is_cut,,sizeof(is_cut));
  69. memset(new_time,,sizeof(new_time));
  70. T = ;
  71. if (tt == )
  72. ptr = ;
  73. else
  74. ptr = ;
  75. for(int i = ; i <= n ; ++ i)
  76. if (!new_time[i] && i != cut_vertx1)
  77. tarjan_dfs(i,);
  78. int maxlen = ;
  79. for(int i = ; i <= n ; ++ i)
  80. if (is_cut[i] >= maxlen)
  81. {
  82. maxlen = is_cut[i];
  83. ptr = i;
  84. }
  85. updata_ans(tt,ptr);
  86. }
  87. }
  88.  
  89. int main(int argc,char *argv[])
  90. {
  91. scanf("%d%d",&n,&m);
  92. for(int i = ; i <= m ; ++ i)
  93. {
  94. int u,v;
  95. scanf("%d%d",&u,&v);
  96. E[u].pb(v) , E[v].pb(u);
  97. }
  98. slove();
  99. printf("%d\n",ans);
  100. return ;
  101. }

UESTC_邱老师的脑残粉 2015 UESTC Training for Graph Theory<Problem D>的更多相关文章

  1. UESTC_方老师和农场 2015 UESTC Training for Graph Theory<Problem L>

    L - 方老师和农场 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  2. UESTC_邱老师选妹子 2015 UESTC Training for Dynamic Programming<Problem H>

    H - 邱老师选妹子 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  3. UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>

    G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  4. UESTC_邱老师看电影 2015 UESTC Training for Dynamic Programming<Problem F>

    F - 邱老师看电影 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  5. UESTC_小panpan学图论 2015 UESTC Training for Graph Theory<Problem J>

    J - 小panpan学图论 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) S ...

  6. UESTC_韩爷的情书 2015 UESTC Training for Graph Theory<Problem H>

    H - 韩爷的情书 Time Limit: 6000/2000MS (Java/Others)     Memory Limit: 262144/262144KB (Java/Others) Subm ...

  7. UESTC_秋实大哥带我飞 2015 UESTC Training for Graph Theory<Problem B>

    B - 秋实大哥带我飞 Time Limit: 300/100MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  8. UESTC_邱老师降临小行星 2015 UESTC Training for Search Algorithm & String<Problem B>

    B - 邱老师降临小行星 Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65536/65535KB (Java/Others) Su ...

  9. UESTC_王之盛宴 2015 UESTC Training for Graph Theory<Problem K>

    K - 王之盛宴 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

随机推荐

  1. MicrosoftSQLServer中的锁模式

    在SQL Server数据库中加锁时,除了可以对不同的资源加锁,还可以使用不同程度的加锁方式,即锁有多种模式,SQL Server中锁模式包括: 1.共享锁 SQL Server中,共享锁用于所有的只 ...

  2. Hessian和Burlap入门教程

    一.简介 Hessian和Burlap是由Caucho Technology提供的基于HTTP协议的轻量级远程服务解决方案.他们都致力于借助尽可能简单那的API和通信协议来简化Web服务.    He ...

  3. KafkaOffsetMonitor监控

    介绍 KafkaOffsetMonitor是有由Kafka开源社区提供的一款Web管理界面,这个应用程序用来实时监控Kafka服务的Consumer以及它们所在的Partition中的Offset,你 ...

  4. chroot 与 jail

    所谓“监牢”就是指通过chroot机制来更改某个进程所能看到的根文件夹,即将某进程限制在指定文件夹中,保证该进程仅仅能对该文件夹及其子文件夹的文件有所动作,从而保证整个server的安全. 创建chr ...

  5. IOS上 关于状态栏的相关设置(UIStatusBar)

    知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时间等部分: 背景部分:就是显示黑色或者图片的背景部分: 如 ...

  6. Cordova for android怎样在App中处理退出button事件

    项目须要在HTML5 Android App中增加对返回键的处理,发现直接在Activity中加返回键处理代码不起作用,分析cordova源代码发现返回键已经被WebView处理掉了,所以仅仅能在js ...

  7. EffectiveC#7--选择恒定的原子值类型数据

    1.恒定类型就是一但它们被创建,它们(的值)就是固定的. 恒定类型可以很好的在基于哈希代码的集合上工作.以Object.GetHashCode()方法返回的值,对同一个实例是必须相同的 2.一个客户类 ...

  8. 在Java中编写带占位符的SQL语句

    C#中SQL中带占位符的语句 假设有一张学员信息表Student,通过表中的ID来找学员,查询的SQL语句如下 string sql = string.Format("select * fr ...

  9. 使用bootstrapvalidator的remote验证经验

    这里需要说一下,bootstrapvalidator的帮助文档写的比较简单,对于remote验证器的说明更是如此,在经历多方测试之后才明白如何使用这个验证器. 一个典型的ajax验证代码如下: 服务端 ...

  10. linux上备份Oracle时EXP-00091的错误解决方法

    unix/linux上备份Oracle时EXP-00091的错误解决方法 unix/linux上备份数据时的错误解决方法 EXP-00091: Exporting questionable stati ...