hdu6041仙人掌图
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仙人掌图相关推荐
- SHOI2008仙人掌图(tarjan+dp)
Solution 好题啊没的说. 本题需要求出仙人掌的直径,但仙人掌是一个带有简单环的一张图无法直接用树形dp求解,但它有一个好东西就是没有类似环套环的东西,所以我们在处理时就方便了一些. 思路:ta ...
- [BZOJ]1023: [SHOI2008]cactus仙人掌图
Time Limit: 1 Sec Memory Limit: 162 MB Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这 ...
- [SHOI2008]cactus仙人掌图
Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...
- 【刷题】BZOJ 1023 [SHOI2008]cactus仙人掌图
Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...
- bzoj 1023: [SHOI2008]cactus仙人掌图(仙人掌求直径)
1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3668 Solved: 1535 [Submi ...
- BZOJ1023 [SHOI2008]仙人掌图
Address BZOJ1023 洛谷P4244 Solution 第一次做仙人掌图. 主要难在环中 DP 值的处理. 注意题目中提到的性质: 仙人图上的每条边,或者是这张仙人图的桥,或者在且仅在一个 ...
- Acwing 360. Freda的传呼机(仙人掌图重构,lca)
为了随时与rainbow快速交流,Freda制造了两部传呼机.Freda和rainbow所在的地方有N座房屋.M 条双向光缆. 每条光缆连接两座房屋,传呼机发出的信号只能沿着光缆传递,并且传呼机的信号 ...
- HDU - 3594 Cactus (仙人掌图)
题意: 给出一个图,判断该图是不是仙人掌图. 分析: 给出仙人掌的详解:https://files-cdn.cnblogs.com/files/ambition/cactus_solution.pdf ...
- cactus仙人掌图【仙人掌圆方树+树形DP+单调队列】
题目链接 BZOJ 1023 首先,圆方树是比较好想到的,维护直径,我们最方便的做法就是先让它变成一棵树,这里因为是仙人掌图,所以就用圆方树来构建. 再者,就是维护直径了,比较好想到的是非环上结点,就 ...
最新文章
- R语言使用ggplot2绘制带有边缘直方图的散点图实战
- UVa --10566
- NET 知识体系结构
- Java面试——MyBatis系列总结
- 大公司里怎样开发和部署前端代码?
- 计算机科学与软件工程的区别
- 【CF1152F】Neko Rules the Catniverse(动态规划)
- 618秒杀抢不到?用Python完成毫秒级抢单,助你秒杀淘宝大单
- linux iometer io
- java拼音查询_Java汉字获取拼音、笔划、偏旁部首
- 【新知实验室】腾讯云TRTC接入测试以及状态同步功能重点验证
- treemap倒叙_lua 模拟Treemap 排序
- 他发现了古老疟疾背后的元凶,也在质疑声中开创了致病生物的新时代
- 【报告分享】2021全球自由行报告-中国旅游研究院马蜂窝(附下载)
- 纯CSS Material Design风格按钮
- node.js学习总结:node.js的内置模块,模块化,npm与包 express,前后端身份认证 JWT认证机制
- Ubuntu15.04下搭建LNMP环境 - 无需整理
- latex徒手写论文之小白篇
- Linux系统 06 python环境配置04 之 python操作redis
- Java8 Time包幕布笔记