Educational Codeforces Round 54 (Rated for Div. 2): D. Edge Deletion(最短路树)
题意:
给你n个点m条边的无向图,其中1号节点是市中心,你现在最多只能保留k条边,并要求所有点到市中心的最短路尽量不变(也就是说设点i到点1的最短路为di,那么删边之后,要保证尽可能多的点,它到1的最短路仍然是di),求保留哪k条边,当然你可以保留<k条边就是了
思路:
对于每个点u,一定存在last[u]表示从1到u的走最短路,上一个点是哪个点,当然可能不唯一,不过无所谓
这样求一遍1到所有点的最短路之后,对于每个点u,last[u]向u连一条边,这样可以得到一棵最短路树
然后保留最短路树上的边就行了
就这么简单,不过求最短路的时候尽量不要用SPFA,因为它可能被卡到O(nm)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define LL long long
#define mod 1000000007
typedef struct Road
{LL len;int x, y, id;bool operator < (const Road &b) const{if(len>b.len)return 1;return 0;}
}Road;
vector<Road> G[300005], F[300005];
LL dp[300005], ans[300005];
int last[300005], vis[300005], k;
priority_queue<Road> q;
void Sech(int u)
{int i, v;for(i=0;i<F[u].size();i++){v = F[u][i].y;if(k>=1){printf("%d ", F[u][i].id);k--;}Sech(v);}
}
int main(void)
{Road now, temp;int x, y, n, m, i, v;scanf("%d%d%d", &n, &m, &k);memset(dp, -1, sizeof(dp));for(i=1;i<=m;i++){scanf("%d%d%lld", &x, &y, &now.len), now.id = i;now.x = x, now.y = y, G[x].push_back(now);now.x = y, now.y = x, G[y].push_back(now);}dp[1] = last[1] = 0;for(i=0;i<G[1].size();i++){q.push(G[1][i]);vis[G[1][i].id] = 1;}while(q.empty()==0){now = q.top();q.pop();if(dp[now.y]==-1){dp[now.y] = now.len;last[now.y] = now.x;F[now.x].push_back(now);for(i=0;i<G[now.y].size();i++){v = G[now.y][i].y;temp.x = now.y, temp.y = v, temp.id = G[now.y][i].id;if(vis[temp.id]==0){temp.len = G[now.y][i].len+dp[now.y];q.push(temp);vis[temp.id] = 1;}}}}if(k>=n-1)k = n-1;printf("%d\n", k);Sech(1);printf("\n");return 0;
}
Educational Codeforces Round 54 (Rated for Div. 2): D. Edge Deletion(最短路树)相关推荐
- Educational Codeforces Round 54 (Rated for Div. 2) D Edge Deletion (SPFA + bfs)
题目大意:给定你一个包含n个点m条边的无向图,现在最多在图中保留k条边,问怎么删除多的边,使得图中良好的节点数最多,求出保留在图中的边的数量和编号. 良好的节点定义为:删除某条边后该点到点1的最短距离 ...
- Educational Codeforces Round 54 (Rated for Div.2)
Educational Codeforces Round 54 (Rated for Div.2) D. Edge Deletion 题意:一张n个点的无向图,保留其中k条边,使得有尽可能多的点与1的 ...
- Educational Codeforces Round 54 (Rated for Div. 2): E. Vasya and a Tree(DFS+差分)
题意: 给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值 ...
- Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)
Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...
- Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...
- Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...
- Educational Codeforces Round 37 (Rated for Div. 2) 1
Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意:Max想给花园浇水.花园可被视为长度为n的花园床,花园 ...
- Educational Codeforces Round 89 (Rated for Div. 2)(A, B, C, D)
Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords 思路 题意非常简单,就是得到最多的物品嘛,我们假定a, ...
- Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs
传送门 文章目录 题意: 思路: 题意: 你有nnn个装备槽,每个槽里面有cic_ici个力量加成,对于每个槽只能选一个力量加成,现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2 ...
最新文章
- 非常简单的截图小工具
- java word模板替换多行_java poi word模板替换段落的换行显示
- 哈希表(HASHTABLE)
- Create new Fiori catalog group via personalization
- 最重要的是跑完,而不是刚开始跑得有多快
- vue横向树结构_vue树形结构的实现
- 机器学习必备:前20名Python人工智能和机器学习开源项目
- # WordPress 除了主页以外的页面都提示Not Found的问题(Centos)
- docker运行中的container怎么修改之前run时的env
- C++数据结构01--顺序线性表实现
- oracle 视图权限 oracle 创建视图权限不足( ORA-01031: 权限不足)
- 数据包的忽略打印与脱敏打印
- 微信小程序实现底部导航栏自定义tabBar
- 2021-08-14
- 转变为灰度图像的算法优化及马赛克实现代码
- kaggle:Quora Insincere Questions Classification
- 移动端/嵌入式-CV模型-2018:MobelNets-v2【Inverted Residuals(中间胖两头瘦)、Linear Bottlenecks(每个倒残差的最后一个卷积层使用线性激活函数)】
- OS学习笔记-1(清华大学慕课)操作系统概述
- 2016中国大数据技术大会在北京盛大召开
- 大裁员席卷阿里,P9 大咖连夜赠书,奋战 2 个月成功斩获 offer
热门文章
- python表白代码-python浪漫表白源码
- python视频免费百度云-Python开发视频百度云分享
- python主要用来做什么-python语言都可以做什么
- python是什么-马哥教育官网-专业Linux培训班,Python培训机构
- linux ssh客户端乱码,Win10专业版下Open ssh客户端乱码咋办?
- centos6.5 升级oracle 10.2.0.5.0,CentOS5上升级ORACLE到10.2.0.4时,检测操作系统失败的解决方法...
- Node-介绍与模块化
- Web API-BOM- 操作浏览器
- vue+three.js开发
- Vue使用html2canvas将Dom转化为图片