HDU 6041 I Curse Myself ——(仙人掌图,tarjan,转化)
题解见这个博客:http://blog.csdn.net/ME495/article/details/76165039。
复杂度不太会算。。这个经典问题的解法需要注意,维护队列里面只有k个元素即可。另外,tarjan对无向图仙人掌图缩点(即只把所有环变成一个点)得注意一下(栈得手写才能实现要求,这是因为在这里割边不能被算进环内,而在有向图中,一个点也算是强连通分量的)。
代码如下:
- #include <stdio.h>
- #include <algorithm>
- #include <string.h>
- #include <vector>
- #include <stack>
- #include <queue>
- using namespace std;
- const int N = + ;
- typedef pair<int, int> pii;
- struct edge
- {
- int u, v, w;
- };
- int n, m, k;
- unsigned int tot;
- vector<edge> G[N];
- int dfs_clock, bcc_cnt, dfn[N];
- edge S[N*];
- int top;
- vector<int> a[N*];
- int ans[][ + ], sz[];
- void init()
- {
- memset(dfn, , sizeof dfn);
- for(int i=;i<=n;i++) G[i].clear();
- dfs_clock = ;
- bcc_cnt = ;
- tot = ;
- top = ;
- memset(ans, , sizeof ans);
- sz[] = ;
- }
- int test = ;
- void tarjan(int u, int fa)
- {
- dfn[u] = ++dfs_clock;
- for(int i=;i<G[u].size();i++)
- {
- edge e = G[u][i];
- int v = e.v, w = e.w;
- if(v == fa) continue;
- if(!dfn[v])
- {
- S[++top] = e;
- tarjan(v, u);
- top--;
- }
- else if(dfn[v] < dfn[u])
- {
- bcc_cnt++;
- a[bcc_cnt].clear();
- a[bcc_cnt].push_back(e.w);
- int top1 = top;
- for(;;)
- {
- edge x = S[top1--];
- a[bcc_cnt].push_back(x.w);
- if(x.u == v) break;
- }
- }
- }
- }
- bool cmp(int x, int y) {return x > y;}
- struct node
- {
- int id, w;
- bool operator < (const node & temp) const
- {
- return w < temp.w;
- }
- };
- void merge(int *pre, int r, vector<int> &v, int *now)
- {
- priority_queue<node> Q;
- for(int i=;i<v.size();i++) Q.push((node){, pre[] + v[i]});
- for(int i=;i<k;i++)
- {
- sz[(r+)&] = i + ;
- node temp = Q.top(); Q.pop();
- now[i] = temp.w;
- if(temp.id + < sz[r&]) Q.push((node){temp.id+, temp.w-pre[temp.id]+pre[temp.id+]});
- if(Q.empty()) break;
- }
- }
- int main()
- {
- int kase = ;
- while(scanf("%d%d",&n,&m) == )
- {
- init();
- for(int i=;i<=m;i++)
- {
- int u, v, w;
- scanf("%d%d%d",&u,&v,&w);
- G[u].push_back((edge){u, v, w});
- G[v].push_back((edge){v, u, w});
- tot += w;
- }
- scanf("%d",&k);
- tarjan(, -);
- for(int i=;i<=bcc_cnt;i++)
- {
- sort(a[i].begin(), a[i].end(), cmp);
- merge(ans[(i-)&],i-,a[i],ans[i&]);
- }
- unsigned int sum = ;
- for(int i=;i<sz[bcc_cnt&];i++)
- {
- sum += (unsigned int)(i+) * (unsigned int)(tot-ans[bcc_cnt&][i]);
- }
- printf("Case #%d: %u\n",kase++,sum);
- }
- return ;
- }
HDU 6041 I Curse Myself ——(仙人掌图,tarjan,转化)的更多相关文章
- HDU 6041 - I Curse Myself | 2017 Multi-University Training Contest 1
和题解大致相同的思路 /* HDU 6041 - I Curse Myself [ 图论,找环,最大k和 ] | 2017 Multi-University Training Contest 1 题意 ...
- HDU 6041.I Curse Myself 无向仙人掌图
I Curse Myself Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- HDU 6041 I Curse Myself(二分+搜索)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6041 [题目大意] 给出一个仙人掌图,求第k小生成树 [题解] 首先找到仙人掌图上的环,现在的问题 ...
- bzoj 1023: [SHOI2008]cactus仙人掌图 tarjan缩环&&环上单调队列
1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1141 Solved: 435[Submit][ ...
- HDU 3594 Cactus 有向仙人掌图判定
题意 给出一个有向图,并给出仙人掌图的定义 图本身是强连通的 每条边属于且只属于一个环 判断输入的图是否是强连通的. 分析 杭电OJ上的数据比较弱,网上一些有明显错误的代码也能AC. 本着求真务实的精 ...
- hdu 3594 Cactus /uva 10510 仙人掌图判定
仙人掌图(有向):同时满足:1强连通:2任何边不在俩个环中. 个人理解:其实就是环之间相连,两两只有一个公共点,(其实可以缩块),那个公共点是割点.HDU数据弱,网上很多错误代码和解法也可以过. 个人 ...
- HDU 6041 I Curse Myself(点双联通加集合合并求前K大) 2017多校第一场
题意: 给出一个仙人掌图,然后求他的前K小生成树. 思路: 先给出官方题解 由于图是一个仙人掌,所以显然对于图上的每一个环都需要从环上取出一条边删掉.所以问题就变为有 M 个集合,每个集合里面都有一堆 ...
- hdu 3594 强连通好题仙人掌图,对自己的tarjan模板改下用这个
#include<stdio.h> #include<string.h> #define N 21000 struct node { int v,next; }bian[510 ...
- hdu 6041 I Curse Myself
题目: 点这里OvO http://acm.hdu.edu.cn/showproblem.php?pid=6041 2017 Multi-University Training Contest - T ...
随机推荐
- DropDownList下拉控件
<asp:DropDownList ID="DropDownList1" runat="server" Width="177px" ...
- 1.MVC基础-初识MVC,与WebForm比较
1.Net WebForm的开发模式
- gradle上传jar包到maven公共仓库
首先这里说的中央仓库 是指的 https://issues.sonatype.org/ 而不是maven私服. 其次是使用gradle上传jar包,maven上传,网上有很多教程,这里不做赘述. 首选 ...
- 如何使用点击超链接的方式打开Android手机上的应用
在Android应用的AndroidManifest.xml里加入如下的配置片段: <action android:name="my_action"/> <cat ...
- shell 数学运算
数学运算之 expr expr操作符对照表 比较大小,只能对整数进行比较,需要加空格,linux 保留关键字要转义 num1=30 num2=50 expr $num1 \> $num2 查看上 ...
- [#Linux] CentOS 7 应用程序添加快捷方式到桌面
在centos使用中,会发现应用程序只能到eclipse的目录中执行eclipse的脚本去启动.这样很不方便. 查阅资料后找到了解决方案: 1.通过命令行,进入到桌面文件夹中 cd /home/you ...
- Python面向对象之进阶
一.property 内置函数 装饰器的使用:所有的装饰器函数.方法.类的上一行直接@装饰器的名字 装饰器的分类: ① 装饰函数 ② 装饰方法 ③ 装饰类 property 是一个装饰器函数 @pro ...
- 利用 Python django 框架 输入汉字,数字,字符,等。。转成二维码!
利用 Python django 框架 输入汉字,数字,字符,等..转成二维码! 模块必备:Python环境 + pillow + qrcode 模块 核心代码import qrcode qr = ...
- 孤陋寡闻了吧?Python 居然可以做这30件神奇好玩的事情(附教程)
知乎上有个浏览超过400万的问题:可以用 Python 编程语言做哪些神奇好玩的事情? 我先举一个很不专业的栗子...... 然后再找几个人抬一堆例子来...... 不是很稀饭<复联>嘛, ...
- [Jenkins][centos]1 持续集成 之 配置VNC,部署Jenkins
痛点:上一篇的AWS部署的VNC不知为啥挂了,死活连不上,因此改申请京东云做部署Jenkins 预计阅读时间:20分钟 更新软件,安装桌面 yum -y update yum -y groupinst ...