题解见这个博客: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. 《图解HTTP》读后总结

    阅读时间:2019.10.30-2019.11.6 阅读心得: 从知乎上看到有人推荐这本书,本身对计算机网络方面学习的比较少,于是就买来这本书开始看.这本书总体看下来比较轻松,因为书中的插画非常卡通, ...

  2. linux环境下jdk安装

    1,下载jdk版本 jdk-7u25-linux-x64.tar.gz  和windows jdk一致,jvm有区别: 2,拷贝到 /home目录下.通过tar -zxvf jdk-7u25-linu ...

  3. iOS - starckView 类似Android线性布局

    同iOS以往每个迭代一样,iOS 9带来了很多新特性.UIKit框架每个版本都在改变,而在iOS 9比较特别的是UIStackView,它将从根本上改变开发者在iOS上创建用户界面的方式.本文将带你学 ...

  4. element-ui 日期选择器范围时间限制

    来自 https://www.cnblogs.com/xjcjcsy/p/7977966.html 侵删 ElementUI是饿了么推出的一套基于vue2.x的一个ui框架.官方文档也很详细,这里做一 ...

  5. TR-银行主数据相关BAPI

    BAPI_BANKDETAIL_CREATE FI01:BAPI_BANK_CREATE FI12:BAPI_HOUSE_BANK_REPLICATE 1011 Business Object Ban ...

  6. Shell 脚本操作数据库实战

    安装mariadb 数据库  (默认没有密码,直接mysql即可进入数据库管理控制台) yum install mariadb mariadb-server mariadb-libs -y syste ...

  7. Computer Vision_33_SIFT:ORB_An efficient alternative to SIFT or SURF——2012

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...

  8. zabbix server for Centos 6.3

    1.安装LNMP 参照http://lnmp.org/install.html 2.安装zabbix service 2.1下载zabbix,并解压 wget http://nchc.dl.sourc ...

  9. inotify文件监控

    参考:xxxx /*************************************************************************\* Copyright (C) M ...

  10. 二进制部署kubernetes集群(下篇)

    1.k8S核心资源管理方法 1.1.陈述式资源管理方法 1.1.1.管理名称空间资源 1.1.1.1.查看名称空间 [root@hdss7-21 ~]# kubectl get namespace N ...