题解见这个博客: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. 你听过稀疏数组(sparseArray)吗?

    稀疏数组(sparseArray) 基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: 1.记录数组一共有几行几列,有多少个不同的值 ...

  2. iOS - 处理通话或录音状态中界面错乱的重布局

    iphone设备在通话或录音状态中,状态栏下移了20个像素,这时controller的view的frame的高度就减少了20个像素,所以我们需要根据view的frame去布局子view.但是是,当状态 ...

  3. react-native 沉浸式状态栏

    使用StatusBar即可实现沉浸式,但是必须把背景色设置为透明.否则如果有不同页面的头部颜色不一样的话,导航栏的颜色动画会很怪异,不会是跟着页面一起动画. <StatusBar barStyl ...

  4. Java 之 字符输出流[writer]

    一.字符输出流 java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地.   它定义了字节输出流的基本共性功能方法. void write(int c) ...

  5. 【数字图像处理】gamma变换

    论文:gamma校正的快速算法及其c语言实现 gamma变换实现过程 假设图像中有一个像素,值是 200 ,那么对这个像素进行校正必须执行如下步骤: 1. 归一化 :将像素值转换为  0 - 1  之 ...

  6. Matplotlib pyplot中title() xlabel() ylabel()无法显示中文(即显示方框乱码)的解决办法

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/11020246.html 一.无法正常显示原因 ...

  7. java数据类型转换的常见方法

    public class Testfun { public static void main(String[] args) { // (一)跨Number父类的类型转换 // 1.str转int =& ...

  8. django_rest framework 接口开发(一)

    1 restful 规范(建议) 基于FbV def order(request): if request.method=="GET": return HttpResponse(' ...

  9. Android笔记(四) Activity之间的数据传递

    我们之前使用Intent进行Activity之间的跳转,其实Intent还可以在启动活动的时候传递数据. Intent提供了一系列的putExtra方法以便我们把想要传递的数据暂存在Intent中,待 ...

  10. 备份一下我的88bugs的application文档

    # 服务端口 server.port=8083 #spring.mvc.favicon.enabled=false server.servlet.context-path=/bug/ dateform ...