题目描述:

有一天,pqq准备去给×i×准备礼物,他有一些礼品准备包装一下,他用线将这些礼物连在一起,不同的礼物因为风格不同所以连接它们需要不同价值的线。风格差异越大,价格越大(所以两个礼物之间只有一种连接价格),当然有些礼物实在太不友好,所以有些礼物无法相连。pqq打算把所有礼物打包在一起,他不准备花太多钱,但更不想花最少的钱(免得被拒绝)。所以他想知道第二便宜的包装方案(可重复,pqq会认为这是天命并直接选用最小代价来包装礼物),同时,他还想知道最小的包装代价以向×i×进行炫耀。但是由于pqq不够心灵手巧,所以他准备找你来帮他计算答案。

 

输入格式:

 两个数n,m表示有n个礼物,有m对礼物可以相连1≤n,m≤2∗105

 接下来的m行每行三个数a,b,c,表示a礼物和b礼物可以用c的价值相连 , 1≤a,b≤n,1≤c≤106

 

输出格式:

输出一行,包含两个数,分别是最小代价和次小代价

 

样例输入:

5 10
1 2 1
2 3 2
3 4 3
4 5 4
1 3 5
1 4 6
1 5 7
2 4 8
2 5 9
3 5 10

 

样例输出:

10 11

瞎扯:我其实很好奇XiX是谁啊┐(´∀`)┌

题解:其实非严格次小生成树的思路还是很好理解的首先是什么是非严格次小生成树就是树边和可以等于和大于最小生成树的另一颗生成树假设现在要把一条非树边(u,v,c)加入最小生成树,想必要去掉一条原生成树中u->v的边,显然去掉最大边效果是最好的所以在最小生成树上跑一个倍增DP,d[i][j]表示j的2^i次祖先到j的路径中最大的值显然可以跟跳lca一样的在logn的跳出u->v路径上的最大值,当然树链剖分也是可以搞这个东西的,但是再写一颗线段树还享受lognlogn的复杂度emmmm,何必呢……如果能跳出这个值,我们只要枚举每一条非树边,就可以在nlogn的复杂度里跳出非严格次小生成树,然后就A掉了

代码如下:
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pii pair<int,int>
#define mp make_pair
#define int long long
using namespace std;int fa[200010],vis[200010],deep[200010],n,m,f[19][250010],d[19][250010],ans1,ans2;
vector<pii> g[200010];
struct line
{int from,to,cost;
}l[200010];int cmp(line a,line b)
{return a.cost<b.cost;
}void init()
{for(int i=1;i<=n;i++){fa[i]=i;}
}int find(int x)
{if(fa[x]==x) return x;return fa[x]=find(fa[x]);
}void unity(int t,int x,int y,int c)
{int fx=find(x);int fy=find(y);if(fx==fy) return ;fa[fx]=fy;ans1+=c;vis[t]=1;
    g[x].push_back(mp(y,c));g[y].push_back(mp(x,c));
}void dfs(int now,int ff,int dist,int dep)
{d[0][now]=dist;f[0][now]=ff;deep[now]=dep;for(int i=1;i<=18;i++){f[i][now]=f[i-1][f[i-1][now]];}for(int i=1;i<=18;i++){d[i][now]=max(d[i-1][now],d[i-1][f[i-1][now]]);}for(int i=0;i<g[now].size();i++){if(g[now][i].first==ff) continue;dfs(g[now][i].first,now,g[now][i].second,dep+1);}
}int get(int u,int v)
{int x=u,y=v;if(deep[x]<deep[y]) swap(x,y);int di=0;for(int i=18;i>=0;i--){if(deep[f[i][x]]>=deep[y]){di=max(di,d[i][x]);x=f[i][x];}}if(x==y) return di;for(int i=18;i>=0;i--){if(f[i][x]!=f[i][y]){di=max(max(d[i][x],d[i][y]),di);x=f[i][x];y=f[i][y];}}return max(di,max(d[0][x],d[0][y]));
}signed main()
{scanf("%lld%lld",&n,&m);init();for(int i=1;i<=m;i++){scanf("%lld%lld%lld",&l[i].from,&l[i].to,&l[i].cost);}sort(l+1,l+m+1,cmp);for(int i=1;i<=m;i++){unity(i,l[i].from,l[i].to,l[i].cost);}dfs(1,0,0,1);ans2=1e16;for(int i=1;i<=m;i++){if(!vis[i]){ans2=min(ans2,ans1+l[i].cost-get(l[i].from,l[i].to));}}printf("%lld %lld\n",ans1,ans2);
}

 

转载于:https://www.cnblogs.com/stxy-ferryman/p/9325557.html

XJOI 3629 非严格次小生成树(pqq的礼物)相关推荐

  1. 非严格次小生成树 pqq的礼物

    题目描述 吐槽一下 思考人生 安利一发 题目描述 有一天,pqq准备去给×i×准备礼物,他有一些礼品准备包装一下,他用线将这些礼物连在一起,不同的礼物因为风格不同所以连接它们需要不同价值的线.风格差异 ...

  2. 【POJ1679】The Unique MST(非严格次小生成树)

    problem 给出一个连通无向图,判断它的最小生成树是否唯一 如果唯一,输出生成树的大小,否则输出"Not Unique!" solution 直接求非严格次小生成树 如果次小生 ...

  3. 非严格次小生成树+严格次小生成树

    非严格次小生成树+严格次小生成树 非严格次小生成树:首先使用最小生成树算法将最小生成树求出来,将生成树建图,然后用倍增维护树上的最大值. 考虑将所有的非树边一次加入最小生成树,并将新边与最小生成树形成 ...

  4. 一棵树的生成树有几颗_次小生成树(树剖,生成树)

    生成树的概念: 在一个无向图中,设顶点数为\(n\),取其中\(n-1\)条边并使所有点相连,所得到的一棵树即为生成树. 最小生成树: 如果还没有接触过生成树的同学,欢迎戳->最小生成树详解 次 ...

  5. 次小生成树(Prim + Kruaskal)

    问题引入: 我们先来回想一下生成树是如何定义的,生成树就是用n - 1条边将图中的所有n个顶点都连通为一个连通分量,这样的边连成子树称为生成树. 最小生成树很明显就是生成树中权值最小的生成树,那么我们 ...

  6. (luogu4180) [Beijing2010组队]次小生成树Tree

    严格次小生成树 首先看看如果不严格我们怎么办. 非严格次小生成树怎么做 由此,我们发现一个结论,求非严格次小生成树,只需要先用kruskal算法求得最小生成树,然后暴力枚举非树边,替换路径最大边即可. ...

  7. 最小生成树、次小生成树

    一.最小生成树 说到生成树首先要解释一下树,树是一个联通的无向无环图,多棵树的集合则被称为森林. 因此,树具有许多性质: 1.两点之间的路径是唯一的. 2.边数等于点数减一. 3.连接任意两点都会生成 ...

  8. 模板 - LCA最近公共祖先(倍增法、Tarjan、树上差分、LCA优化的次小生成树)

    整理的算法模板合集: ACM模板 注意x和y的LCA可以是x或者y本身 一.LCA的在线倍增算法 /*给定一棵包含 n个节点的有根无向树,有 m个询问,每个询问 给出了一对节点的编号 x和 y,询问 ...

  9. 解题报告:luogu P4180 [BJWC2010]严格次小生成树(次小生成树、倍增LCA优化、O(mlogn) )

    P4180 [BJWC2010]严格次小生成树 次小生成树有两种,一种是不严格次小生成树,也就是可以数值上等于最小生成树,一种是严格次小生成树,是权值严格大于最小生成树,两种求法大同小异. 方法2在严 ...

最新文章

  1. Connection closed by foreign host. 误改BUG
  2. Windows 2000配置Web服务器
  3. 反思读别人代码的思路
  4. Java初始化顺序研究
  5. Idea 依赖冲突一分钟解决2种方案
  6. 《真还传》剧终:6亿欠款还完了?罗永浩被执行信息清零,最新回应来了
  7. 自媒体时事热点类素材哪里找?推荐这3个网站
  8. 打印一只Nyan Cat(彩虹猫)(C++)
  9. 【目标检测-YOLO】YOLO v2总结
  10. 基于三极管的电平转换电路
  11. 用于交通流预测的时间多图卷积网络
  12. 一碗泡面背后的努力,康师傅连续十次斩获“食安管理十强企业”
  13. 敏捷专项练习题202207
  14. OneNET麒麟座应用开发之六:与气体质量流量控制器通讯
  15. 记录踩过的坑-WPS文字
  16. 一个200左右的数字 四个四个的数多一 六个六个的数少一 七个七个的数多六 问此数为多少。。。
  17. fullscan mysql_[InnoDB系列] -- 实测ibbackup vs mysqldump
  18. ARM实验板移植,linux点阵字库的使用
  19. 有了解arm嵌入式主板与x86主板的优势和劣势的吗?
  20. node.js请求接口

热门文章

  1. JAVA调用C语言写的SO文件
  2. 开源如此火热,但研究表明该领域已不再增长
  3. 干 MySQL 两千万数据的大表优化解决过程,三种厉害的解决方案
  4. 从 Java 9 开始,Java 就华丽的转身为微服务了…
  5. Java多线程:捕获线程异常
  6. 创业互联网公司如何搭建自己的技术架构
  7. 聊聊单体应用的 4 点不良影响,第 4 点很痛很真实
  8. Redis 的各项功能解决了哪些问题?
  9. 详解 Java 中 4 种 I/O 模型
  10. Java线程详解(10)-volatile关键字