题意:

给你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(最短路树)相关推荐

  1. Educational Codeforces Round 54 (Rated for Div. 2) D Edge Deletion (SPFA + bfs)

    题目大意:给定你一个包含n个点m条边的无向图,现在最多在图中保留k条边,问怎么删除多的边,使得图中良好的节点数最多,求出保留在图中的边的数量和编号. 良好的节点定义为:删除某条边后该点到点1的最短距离 ...

  2. Educational Codeforces Round 54 (Rated for Div.2)

    Educational Codeforces Round 54 (Rated for Div.2) D. Edge Deletion 题意:一张n个点的无向图,保留其中k条边,使得有尽可能多的点与1的 ...

  3. Educational Codeforces Round 54 (Rated for Div. 2): E. Vasya and a Tree(DFS+差分)

    题意: 给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值 ...

  4. 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这个时候两 ...

  5. Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...

  6. Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...

  7. Educational Codeforces Round 37 (Rated for Div. 2) 1

    Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意:Max想给花园浇水.花园可被视为长度为n的花园床,花园 ...

  8. 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, ...

  9. Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs

    传送门 文章目录 题意: 思路: 题意: 你有nnn个装备槽,每个槽里面有cic_ici​个力量加成,对于每个槽只能选一个力量加成,现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2 ...

最新文章

  1. 非常简单的截图小工具
  2. java word模板替换多行_java poi word模板替换段落的换行显示
  3. 哈希表(HASHTABLE)
  4. Create new Fiori catalog group via personalization
  5. 最重要的是跑完,而不是刚开始跑得有多快
  6. vue横向树结构_vue树形结构的实现
  7. 机器学习必备:前20名Python人工智能和机器学习开源项目
  8. # WordPress 除了主页以外的页面都提示Not Found的问题(Centos)
  9. docker运行中的container怎么修改之前run时的env
  10. C++数据结构01--顺序线性表实现
  11. oracle 视图权限 oracle 创建视图权限不足( ORA-01031: 权限不足)
  12. 数据包的忽略打印与脱敏打印
  13. 微信小程序实现底部导航栏自定义tabBar
  14. 2021-08-14
  15. 转变为灰度图像的算法优化及马赛克实现代码
  16. kaggle:Quora Insincere Questions Classification
  17. 移动端/嵌入式-CV模型-2018:MobelNets-v2【Inverted Residuals(中间胖两头瘦)、Linear Bottlenecks(每个倒残差的最后一个卷积层使用线性激活函数)】
  18. OS学习笔记-1(清华大学慕课)操作系统概述
  19. 2016中国大数据技术大会在北京盛大召开
  20. 大裁员席卷阿里,P9 大咖连夜赠书,奋战 2 个月成功斩获 offer

热门文章

  1. python表白代码-python浪漫表白源码
  2. python视频免费百度云-Python开发视频百度云分享
  3. python主要用来做什么-python语言都可以做什么
  4. python是什么-马哥教育官网-专业Linux培训班,Python培训机构
  5. linux ssh客户端乱码,Win10专业版下Open ssh客户端乱码咋办?
  6. centos6.5 升级oracle 10.2.0.5.0,CentOS5上升级ORACLE到10.2.0.4时,检测操作系统失败的解决方法...
  7. Node-介绍与模块化
  8. Web API-BOM- 操作浏览器
  9. vue+three.js开发
  10. Vue使用html2canvas将Dom转化为图片