hdu6041
题意:给一个仙人掌图,f(i)为该图的第i小生成树的权值,问sum(f(i))1<=i<=k,简单说就是求前k小的生成树的权值的和。
仙人掌图有一个特点就是每条边只存在于图中的一个环中,
左图为仙人掌图,就是有点像仙人掌,有图因为两个环公用一条边,所以不能都成仙人掌图。
由于是仙人掌图,这个题就简单了,我们可以从每个环中取出一条边,那么圣剩下的就是一棵树,so,我们可以把所有权值加起来 记为sum_val,然后求出每个环,把每个环的边权值放入每个数组中,我们从每个数组中取出一个数,求和S,sum_val-S就是一棵生成数的权值了,那么从大到小取出前k个S,就得到前k小的生成树了。
这里有两个难点,一个是求环,一个是取前k个S。
求环思路:用深搜思想,用一个数组dfn记录该点的时间戳,就是第几次搜到的他,原图用双向边建图,搜索时控制一下不往回搜,例如边 u->v , 当u搜到v发现v有一个不为0的时间戳,且dfn[u]>dfn[v],说明我们搜到了一个环,那么就把该环的边的权值记录下来,怎么记呢,用一个栈记录dfn[v]==0的边的信息,当发现环时,退栈,直到栈里的边的u等于当前的v时停止,有点拗口 。看图
最后我们得到了一堆temp数组,我们要从这堆数组中每次取出一个数,求和得到前k大的数。设有w个数组,我们设ans数组存储前k大的和,那么我们可以用优先队列依次合并w个数组。看代码吧,不好说了,

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <string.h>
using namespace std;
const int MAXN=2e5+10;
struct EDGE
{int u,v,w;EDGE() {}EDGE(int u,int v,int w):u(u),v(v),w(w) {}
} stack_me[MAXN];
struct node
{int val,u,v;node(){}node(int val,int u,int v):val(val),u(u),v(v) {}bool operator< (const node &a)const{return val<a.val;///优先队列里大的放上面}
};
vector<EDGE>edge[MAXN];
int K,tot,time_num,top;
int ans[MAXN],dfn[MAXN],set_me[MAXN];
bool cmp(int a,int b)
{return a>b;
}
void Merge()
{int temp[MAXN];priority_queue<node>que;sort(set_me+1,set_me+set_me[0]+1,cmp);for(int i=1;i<=set_me[0];i++)que.push(node(ans[1]+set_me[i],1,i));temp[0]=0;while(temp[0]<K&&!que.empty()){node now=que.top();que.pop();temp[++temp[0]]=now.val;if(now.u<ans[0])que.push(node(ans[now.u+1]+set_me[now.v],now.u+1,now.v));}for(int i=0;i<=temp[0];i++)ans[i]=temp[i];
}
void dfs(int u,int pre)
{int v;dfn[u]=++time_num;for(int i=0; i<edge[u].size(); i++){v=edge[u][i].v;if(v==pre)continue;if(dfn[v]==0){stack_me[++top]=edge[u][i];dfs(v,u);top--;}else if(dfn[u]>dfn[v]){set_me[0]=0;set_me[++set_me[0]]=edge[u][i].w;for(int j=top;; j--){set_me[++set_me[0]]=stack_me[j].w;if(stack_me[j].u==v)break;}Merge();}}
}
int main()
{int n,m;int T=1;while(scanf("%d%d",&n,&m)!=-1){int u,v,w;unsigned allw=0;memset(ans,0,sizeof(ans));for(int i=0; i<m; i++){scanf("%d%d%d",&u,&v,&w);edge[u].push_back(EDGE(u,v,w));edge[v].push_back(EDGE(v,u,w));allw+=w;}scanf("%d",&K);tot=top=0;time_num=0;ans[0]=0;ans[++ans[0]]=0;memset(dfn,0,sizeof(dfn));dfs(1,-1);unsigned sum=0;for(unsigned  i=1;i<=ans[0];i++)sum+=i*(allw-ans[i]);printf("Case #%d: %u\n",T++,sum);for(int i=1;i<=n;i++)edge[i].clear();}return 0;
}

hdu6041仙人掌图相关推荐

  1. SHOI2008仙人掌图(tarjan+dp)

    Solution 好题啊没的说. 本题需要求出仙人掌的直径,但仙人掌是一个带有简单环的一张图无法直接用树形dp求解,但它有一个好东西就是没有类似环套环的东西,所以我们在处理时就方便了一些. 思路:ta ...

  2. [BZOJ]1023: [SHOI2008]cactus仙人掌图

    Time Limit: 1 Sec  Memory Limit: 162 MB Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这 ...

  3. [SHOI2008]cactus仙人掌图

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...

  4. 【刷题】BZOJ 1023 [SHOI2008]cactus仙人掌图

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...

  5. bzoj 1023: [SHOI2008]cactus仙人掌图(仙人掌求直径)

    1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 3668  Solved: 1535 [Submi ...

  6. BZOJ1023 [SHOI2008]仙人掌图

    Address BZOJ1023 洛谷P4244 Solution 第一次做仙人掌图. 主要难在环中 DP 值的处理. 注意题目中提到的性质: 仙人图上的每条边,或者是这张仙人图的桥,或者在且仅在一个 ...

  7. Acwing 360. Freda的传呼机(仙人掌图重构,lca)

    为了随时与rainbow快速交流,Freda制造了两部传呼机.Freda和rainbow所在的地方有N座房屋.M 条双向光缆. 每条光缆连接两座房屋,传呼机发出的信号只能沿着光缆传递,并且传呼机的信号 ...

  8. HDU - 3594 Cactus (仙人掌图)

    题意: 给出一个图,判断该图是不是仙人掌图. 分析: 给出仙人掌的详解:https://files-cdn.cnblogs.com/files/ambition/cactus_solution.pdf ...

  9. cactus仙人掌图【仙人掌圆方树+树形DP+单调队列】

    题目链接 BZOJ 1023 首先,圆方树是比较好想到的,维护直径,我们最方便的做法就是先让它变成一棵树,这里因为是仙人掌图,所以就用圆方树来构建. 再者,就是维护直径了,比较好想到的是非环上结点,就 ...

最新文章

  1. R语言使用ggplot2绘制带有边缘直方图的散点图实战
  2. UVa --10566
  3. NET 知识体系结构
  4. Java面试——MyBatis系列总结
  5. 大公司里怎样开发和部署前端代码?
  6. 计算机科学与软件工程的区别
  7. 【CF1152F】Neko Rules the Catniverse(动态规划)
  8. 618秒杀抢不到?用Python完成毫秒级抢单,助你秒杀淘宝大单
  9. linux iometer io
  10. java拼音查询_Java汉字获取拼音、笔划、偏旁部首
  11. 【新知实验室】腾讯云TRTC接入测试以及状态同步功能重点验证
  12. treemap倒叙_lua 模拟Treemap 排序
  13. 他发现了古老疟疾背后的元凶,也在质疑声中开创了致病生物的新时代
  14. 【报告分享】2021全球自由行报告-中国旅游研究院马蜂窝(附下载)
  15. 纯CSS Material Design风格按钮
  16. node.js学习总结:node.js的内置模块,模块化,npm与包 express,前后端身份认证 JWT认证机制
  17. Ubuntu15.04下搭建LNMP环境 - 无需整理
  18. latex徒手写论文之小白篇
  19. Linux系统 06 python环境配置04 之 python操作redis
  20. Java8 Time包幕布笔记

热门文章

  1. 台式电脑属于小型电子计算机,个人计算机属于小型计算机。
  2. 如何编程阶梯形c语言,阶梯式C语言程序设计实验指导书.doc
  3. 无法解析服务器的dns地址
  4. 传智播客软件测试学习视频汇总:
  5. 利用gpu加速神经网络算法,为什么用gpu 模型训练
  6. vue引入svg图片
  7. 春运正当时 古代人们又是靠什么出行的呢?
  8. 深入理解Kube-APIServer
  9. 【转】免费进入学术数据库
  10. domoticz折腾指南--通过esp_easy固件控制继电器开关