题解见这个博客:http://blog.csdn.net/ME495/article/details/76165039

  复杂度不太会算。。这个经典问题的解法需要注意,维护队列里面只有k个元素即可。另外,tarjan对无向图仙人掌图缩点(即只把所有环变成一个点)得注意一下(栈得手写才能实现要求,这是因为在这里割边不能被算进环内,而在有向图中,一个点也算是强连通分量的)。

  代码如下:

  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <string.h>
  4. #include <vector>
  5. #include <stack>
  6. #include <queue>
  7. using namespace std;
  8. const int N = + ;
  9. typedef pair<int, int> pii;
  10.  
  11. struct edge
  12. {
  13. int u, v, w;
  14. };
  15. int n, m, k;
  16. unsigned int tot;
  17. vector<edge> G[N];
  18. int dfs_clock, bcc_cnt, dfn[N];
  19. edge S[N*];
  20. int top;
  21. vector<int> a[N*];
  22. int ans[][ + ], sz[];
  23. void init()
  24. {
  25. memset(dfn, , sizeof dfn);
  26. for(int i=;i<=n;i++) G[i].clear();
  27. dfs_clock = ;
  28. bcc_cnt = ;
  29. tot = ;
  30. top = ;
  31. memset(ans, , sizeof ans);
  32. sz[] = ;
  33. }
  34. int test = ;
  35. void tarjan(int u, int fa)
  36. {
  37. dfn[u] = ++dfs_clock;
  38. for(int i=;i<G[u].size();i++)
  39. {
  40. edge e = G[u][i];
  41. int v = e.v, w = e.w;
  42. if(v == fa) continue;
  43. if(!dfn[v])
  44. {
  45. S[++top] = e;
  46. tarjan(v, u);
  47. top--;
  48. }
  49. else if(dfn[v] < dfn[u])
  50. {
  51. bcc_cnt++;
  52. a[bcc_cnt].clear();
  53. a[bcc_cnt].push_back(e.w);
  54. int top1 = top;
  55. for(;;)
  56. {
  57. edge x = S[top1--];
  58. a[bcc_cnt].push_back(x.w);
  59. if(x.u == v) break;
  60. }
  61. }
  62. }
  63. }
  64. bool cmp(int x, int y) {return x > y;}
  65. struct node
  66. {
  67. int id, w;
  68. bool operator < (const node & temp) const
  69. {
  70. return w < temp.w;
  71. }
  72. };
  73. void merge(int *pre, int r, vector<int> &v, int *now)
  74. {
  75. priority_queue<node> Q;
  76. for(int i=;i<v.size();i++) Q.push((node){, pre[] + v[i]});
  77. for(int i=;i<k;i++)
  78. {
  79. sz[(r+)&] = i + ;
  80. node temp = Q.top(); Q.pop();
  81. now[i] = temp.w;
  82. if(temp.id + < sz[r&]) Q.push((node){temp.id+, temp.w-pre[temp.id]+pre[temp.id+]});
  83. if(Q.empty()) break;
  84. }
  85. }
  86.  
  87. int main()
  88. {
  89. int kase = ;
  90. while(scanf("%d%d",&n,&m) == )
  91. {
  92. init();
  93. for(int i=;i<=m;i++)
  94. {
  95. int u, v, w;
  96. scanf("%d%d%d",&u,&v,&w);
  97. G[u].push_back((edge){u, v, w});
  98. G[v].push_back((edge){v, u, w});
  99. tot += w;
  100. }
  101. scanf("%d",&k);
  102. tarjan(, -);
  103. for(int i=;i<=bcc_cnt;i++)
  104. {
  105. sort(a[i].begin(), a[i].end(), cmp);
  106. merge(ans[(i-)&],i-,a[i],ans[i&]);
  107. }
  108. unsigned int sum = ;
  109. for(int i=;i<sz[bcc_cnt&];i++)
  110. {
  111. sum += (unsigned int)(i+) * (unsigned int)(tot-ans[bcc_cnt&][i]);
  112. }
  113. printf("Case #%d: %u\n",kase++,sum);
  114. }
  115. return ;
  116. }

HDU 6041 I Curse Myself ——(仙人掌图,tarjan,转化)的更多相关文章

  1. HDU 6041 - I Curse Myself | 2017 Multi-University Training Contest 1

    和题解大致相同的思路 /* HDU 6041 - I Curse Myself [ 图论,找环,最大k和 ] | 2017 Multi-University Training Contest 1 题意 ...

  2. HDU 6041.I Curse Myself 无向仙人掌图

    I Curse Myself Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  3. HDU 6041 I Curse Myself(二分+搜索)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6041 [题目大意] 给出一个仙人掌图,求第k小生成树 [题解] 首先找到仙人掌图上的环,现在的问题 ...

  4. bzoj 1023: [SHOI2008]cactus仙人掌图 tarjan缩环&&环上单调队列

    1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1141  Solved: 435[Submit][ ...

  5. HDU 3594 Cactus 有向仙人掌图判定

    题意 给出一个有向图,并给出仙人掌图的定义 图本身是强连通的 每条边属于且只属于一个环 判断输入的图是否是强连通的. 分析 杭电OJ上的数据比较弱,网上一些有明显错误的代码也能AC. 本着求真务实的精 ...

  6. hdu 3594 Cactus /uva 10510 仙人掌图判定

    仙人掌图(有向):同时满足:1强连通:2任何边不在俩个环中. 个人理解:其实就是环之间相连,两两只有一个公共点,(其实可以缩块),那个公共点是割点.HDU数据弱,网上很多错误代码和解法也可以过. 个人 ...

  7. HDU 6041 I Curse Myself(点双联通加集合合并求前K大) 2017多校第一场

    题意: 给出一个仙人掌图,然后求他的前K小生成树. 思路: 先给出官方题解 由于图是一个仙人掌,所以显然对于图上的每一个环都需要从环上取出一条边删掉.所以问题就变为有 M 个集合,每个集合里面都有一堆 ...

  8. hdu 3594 强连通好题仙人掌图,对自己的tarjan模板改下用这个

    #include<stdio.h> #include<string.h> #define N 21000 struct node { int v,next; }bian[510 ...

  9. hdu 6041 I Curse Myself

    题目: 点这里OvO http://acm.hdu.edu.cn/showproblem.php?pid=6041 2017 Multi-University Training Contest - T ...

随机推荐

  1. DropDownList下拉控件

    <asp:DropDownList    ID="DropDownList1" runat="server" Width="177px" ...

  2. 1.MVC基础-初识MVC,与WebForm比较

    1.Net WebForm的开发模式

  3. gradle上传jar包到maven公共仓库

    首先这里说的中央仓库 是指的 https://issues.sonatype.org/ 而不是maven私服. 其次是使用gradle上传jar包,maven上传,网上有很多教程,这里不做赘述. 首选 ...

  4. 如何使用点击超链接的方式打开Android手机上的应用

    在Android应用的AndroidManifest.xml里加入如下的配置片段: <action android:name="my_action"/> <cat ...

  5. shell 数学运算

    数学运算之 expr expr操作符对照表 比较大小,只能对整数进行比较,需要加空格,linux 保留关键字要转义 num1=30 num2=50 expr $num1 \> $num2 查看上 ...

  6. [#Linux] CentOS 7 应用程序添加快捷方式到桌面

    在centos使用中,会发现应用程序只能到eclipse的目录中执行eclipse的脚本去启动.这样很不方便. 查阅资料后找到了解决方案: 1.通过命令行,进入到桌面文件夹中 cd /home/you ...

  7. Python面向对象之进阶

    一.property 内置函数 装饰器的使用:所有的装饰器函数.方法.类的上一行直接@装饰器的名字 装饰器的分类: ① 装饰函数 ② 装饰方法 ③ 装饰类 property 是一个装饰器函数 @pro ...

  8. 利用 Python django 框架 输入汉字,数字,字符,等。。转成二维码!

    利用 Python django 框架 输入汉字,数字,字符,等..转成二维码! 模块必备:Python环境 + pillow  + qrcode 模块 核心代码import qrcode qr = ...

  9. 孤陋寡闻了吧?Python 居然可以做这30件神奇好玩的事情(附教程)

    知乎上有个浏览超过400万的问题:可以用 Python 编程语言做哪些神奇好玩的事情? 我先举一个很不专业的栗子...... 然后再找几个人抬一堆例子来...... 不是很稀饭<复联>嘛, ...

  10. [Jenkins][centos]1 持续集成 之 配置VNC,部署Jenkins

    痛点:上一篇的AWS部署的VNC不知为啥挂了,死活连不上,因此改申请京东云做部署Jenkins 预计阅读时间:20分钟 更新软件,安装桌面 yum -y update yum -y groupinst ...