【C++心路历程29】严格次小生成树
来源:互联网 发布:淘宝天弘基金找不到了 编辑:程序博客网 时间:2024/06/05 09:41
姊妹题了感觉。另外一种生成树http://blog.csdn.net/ctf109/article/details/74297446
【问题描述】
小C最近学了很多最小生成树的算法,Prim算法、Kurskal算法、消圈算法等等。
正当小C洋洋得意之时,小P又来泼小C冷水了。小P说,让小C求出一个无向图的次小生成树,而且这个次小生成树还得是严格次小的,也就是说:如果最小生成树选择的边集是EM,严格次小生成树选择的边集是ES,那么需要满足:(value(e)表示边e的权值)
这下小C蒙了,他找到了你,希望你帮他解决这个问题。
【输入格式】
第一行包含两个整数N 和M,表示无向图的点数与边数。 接下来 M行,每行 3个数x y z 表示,点x和点y之间有一条边,边的权值为z。
【输出格式】
包含一行,仅一个数,表示严格次小生成树的边权和。(数据保证必定存在严格次小生成树)
【输入样例】
5 6
1 2 1
1 3 2
2 4 3
3 5 4
3 4 3
4 5 6
【输出样例】
11
【数据范围】
数据中无向图无自环;
50% 的数据N≤2 000 M≤3 000;
80% 的数据N≤50 000 M≤100 000;
100% 的数据N≤100 000 M≤300 000 ,边权值非负且不超过 10^9 。
【分析】
对于每次枚举的非树边,删除树上(u,v)路径中边权小于它的最大边即可。
其他同上面的传送门。
int Qmax(int u,int v,int ww){ if(dep[u]<dep[v]) swap(u,v); int t=-1; while(dep[u]!=dep[v]) { if(dist[u]-dist[fa[u]]<ww) t=max(t,dist[u]-dist[fa[u]]); u=fa[u]; } while(u!=v) { if(dist[u]-dist[fa[u]]<ww) t=max(t,dist[u]-dist[fa[u]]); if(dist[v]-dist[fa[v]]<ww) t=max(t,dist[v]-dist[fa[v]]); u=fa[u],v=fa[v]; } return t;} void solve(){ LL sum=kruskal(); dfs(1,0,1,0);//给LCA做准备 LL ans=inf; for(int i=1;i<=m;i++) { if(used[i]) continue; int u=E[i].u,v=E[i].v; int t=Qmax(u,v,E[i].c);//计算u->v上的小于E[i].w的最大边权 LL tt=t; if(t<0) continue; else ans=min(sum-tt+E[i].c,ans); } cout<<ans;}
阅读全文
0 0
- 【C++心路历程29】严格次小生成树
- 【BZOJ1977】【BJOI2011】严格次小生成树
- BJOI2011 严格次小生成树
- BZOJ1977 (严格)次小生成树
- [BJOI]2010 严格次小生成树
- 【C++心路历程28】 奇葩次小生成树
- bzoj1977 严格的次小生成树(LCA倍增)
- BJOI2011 严格次小生成树 解题报告
- 【结论】【非严格次小生成树】NKOJ3855 merlin
- BZOJ 1977 浅谈严格次小生成树
- POJ 1679 浅谈不严格次小生成树
- [BZOJ1977]严格次小生成树-kruskal+倍增维护
- bzoj 1977 [BeiJing2010组队]次小生成树 Tree [严格的次小生成树]
- 严格次小生成树 并查集和数的综合应用
- 【bzoj1977】【严格次小生成树】倍增维护链上最大次大值
- 次小生成树
- 次小生成树
- 次小生成树
- Oracle SQL语句
- 选择排序算法(python实现)
- JNI:Java调用C函数打印hello,world
- 第2章 在HTML 中使用JavaScript
- Codeforces Round #421 (Div. 2) D. Mister B and PR Shifts
- 【C++心路历程29】严格次小生成树
- Base64编码源码
- Docker-hadoop的伪分布式和集群的搭建
- css兼容性写法大全
- odoo之学习第一个例子test(1)
- ionic优秀资源整理
- mac 下终端 生成jar
- ansible 批量创建用户 密码注意事项
- 我来自哪里?我是谁?我将去向何处?