题解见这个博客: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,转化)的更多相关文章

  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. Eclipse下使用Maven创建项目出现的archetype错误,记,转

    记自:http://blog.csdn.net/ZhuboSun/article/details/50099635 [1]出现的错误提示: Unable to create project from ...

  2. 如何导出robotframework的工程

    不知道是不是只有我一个小白,自己折腾了很久,也百度了很久,不知道怎么导出哇.现在来扫扫盲罗.我拿自己的项目举例:找到我的RF工程目录可以看到下面有3个项目,直接拷贝你想要的项目就ok啦,是不是so e ...

  3. Qt QPushButton 背景色

    正常状态:黑底(背景色),白字(前景色),圆角,向外凸起 鼠标停留:背景和前景反色 鼠标按下:背景色变为淡蓝色,向内凹陷 ui->pushButton->setStyleSheet(&qu ...

  4. Vue路由的使用和route-link router-view样式和动画的设置

    什么是路由 后端路由:**对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源: 前端路由:**对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面 ...

  5. java--分析简单java类与反射的联系

    分析简单java类与反射的联系 web对反射的操作支持 在JSP之中有一种技术--javaBean.而且在jsp里面也配套有相应的操作方式,javaBean的核心在于简单java类,于是下面演示此操作 ...

  6. Windows——系统盘重置密码

    一.制作好系统启动U盘 软碟通自己制作即可 二.这进入到安装前界面按Shift+F10调出命令提示符 三.输入regedit后按回车进入注册表编辑器 四. 左键单击选中HKEY_LOCAL_MACHI ...

  7. javascript reduce 前端交互 总计

    sum(){ return this.products.reduce((total,next)=>{ return total + next.price * next.aumout},0) } ...

  8. springboot ElasticSearch 简单的全文检索高亮

    原文:https://segmentfault.com/a/1190000017324038?utm_source=tag-newest 首先引入依赖 <dependency> <g ...

  9. js基础知识1

    本博客转自某不知名程序员 1. JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:操作网页 ...

  10. 河南省acm第九届省赛--《表达式求值》--栈和后缀表达式的变形--手速题

    表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3   描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, ...