题目链接:点击查看

题目大意:给出一张 n 个点 m 条边的带权无向图,设 d[i]d[ i ]d[i] 为从点 1 到点 i 的最短路,现在要求保留最多 k 条边,使得新图中 d′[i]=d[i]d'[ i ] = d[ i ]d′[i]=d[i] 的点尽量多

题目分析:仍然是两种思路,比较简单的一种思路就是先用迪杰斯特拉求出最短路树,此时树上有 n - 1 条边,每选择一条边,就会使得满足d′[i]=d[i]d'[ i ] = d[ i ]d′[i]=d[i]的点加一,所以直接在最短路树上 dfs 或 bfs 就好了

还有一种更简单的思路,因为迪杰斯特拉是基于贪心实现的,所以每次松弛的时候直接将这条边贪心加入答案,累计松弛 k 次即可

需要注意的就是,数据会爆 int,记得开 long long

代码:
最短路树+bfs

// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e6+100;//顶点数 int n,m,k;vector<int>node[N],ans;template<typename T>
struct Dij
{const static int N=1e6+100;struct Edge{int to,next,id;T w;}edge[N];int head[N],cnt;//链式前向星 T d[N];int fa[N],fa_id[N];bool vis[N];void addedge(int u,int v,T w,int id){edge[cnt].id=id;edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;}struct Node{int to;T w;Node(int TO,T W){to=TO;w=W;}bool operator<(const Node& a)const{return w>a.w;}};void Dijkstra(int st){priority_queue<Node>q;memset(vis,false,sizeof(vis));memset(d,0x3f,sizeof(d));d[st]=0;q.push(Node(st,0));while(q.size()){Node cur=q.top();int u=cur.to;q.pop();if(vis[u])continue;vis[u]=true;for(int i=head[u];i!=-1;i=edge[i].next)//扫描出所有边 {int v=edge[i].to;T w=edge[i].w;if(d[v]>d[u]+w)//更新 {fa[v]=u;fa_id[v]=edge[i].id;d[v]=d[u]+w;q.push(Node(v,d[v]));}}}}void build(){for(int i=2;i<=n;i++)node[fa[i]].push_back(i);}void bfs(){queue<int>q;q.push(1);while(q.size()&&(int)ans.size()<=k){int u=q.front();q.pop();ans.push_back(fa_id[u]);for(auto v:node[u])q.push(v);}}void init(){memset(head,-1,sizeof(head));cnt=0; }
};Dij<LL>t;int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);t.init();scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);t.addedge(u,v,w,i);t.addedge(v,u,w,i);}t.Dijkstra(1);t.build();t.bfs();printf("%d\n",(int)ans.size()-1);for(int i=1;i<(int)ans.size();i++)printf("%d ",ans[i]);puts("");return 0;
}

贪心

// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e6+100;//顶点数 vector<int>ans;template<typename T>
struct Dij
{const static int N=1e6+100;struct Edge{int to,next,id;T w;}edge[N];int head[N],cnt;//链式前向星 T d[N];bool vis[N];void addedge(int u,int v,T w,int id){edge[cnt].id=id;edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;}struct Node{int to,id;T w;Node(int TO,T W,int ID){id=ID;to=TO;w=W;}bool operator<(const Node& a)const{return w>a.w;}};void Dijkstra(int st,int k){priority_queue<Node>q;memset(vis,false,sizeof(vis));memset(d,0x3f,sizeof(d));d[st]=0;q.push(Node(st,0,-1));while(q.size()&&(int)ans.size()<=k){Node cur=q.top();int u=cur.to;q.pop();if(vis[u])continue;vis[u]=true;ans.push_back(cur.id);for(int i=head[u];i!=-1;i=edge[i].next)//扫描出所有边 {int v=edge[i].to,id=edge[i].id;T w=edge[i].w;if(d[v]>d[u]+w)//更新 {d[v]=d[u]+w;q.push(Node(v,d[v],id));}}}}void init(){memset(head,-1,sizeof(head));cnt=0; }
};Dij<LL>t;int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);t.init();int n,m,k;scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);t.addedge(u,v,w,i);t.addedge(v,u,w,i);}t.Dijkstra(1,k);printf("%d\n",(int)ans.size()-1);for(int i=1;i<(int)ans.size();i++)printf("%d ",ans[i]);return 0;
}

CodeForces - 1076D Edge Deletion(最短路+贪心/最短路树+bfs)相关推荐

  1. bzoj3694:最短路(最短路树+并查集)

    3694:最短路 时间限制: 1000 ms 内存限制: 262144 KB 题目描述 给出一个 n n n个点m" role="presentation" style= ...

  2. Edge Deletion CodeForces - 1076D(水最短路)

    题意: 设从1到每个点的最短距离为d,求删除几条边后仍然使1到每个点的距离为d,使得剩下的边最多为k 解析: 先求来一遍spfa,然后bfs遍历每条路,如果d[v] == d[u] + Node[i] ...

  3. 【CodeForces Round #550】A-F | 模拟 | 贪心 | 高精 | BFS | 二分图 | E

    今年怎么没有愚人节比赛了   CF你看看人家洛谷   唉鸭原来那边还没到愚人节呢- 愚人节比赛还是有的,在今晚 qwq [CodeForces 1144   A-F] Tags:模拟 贪心 BFS 高 ...

  4. Educational Codeforces Round 54 (Rated for Div. 2): D. Edge Deletion(最短路树)

    题意: 给你n个点m条边的无向图,其中1号节点是市中心,你现在最多只能保留k条边,并要求所有点到市中心的最短路尽量不变(也就是说设点i到点1的最短路为di,那么删边之后,要保证尽可能多的点,它到1的最 ...

  5. Codeforces Round #303 (Div. 2) E. Paths and Trees 最短路+贪心

    题目链接: 题目 E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes inputs ...

  6. 【CodeForces - 545 ABCDE套题训练题解】贪心, 构造,模拟,dp,最短路树(Dijkstra+变形)

    A: 题干: Input The first line contains integer n (1 ≤ n ≤ 100) - the number of cars. Each of the next  ...

  7. (Div.2)D. Edge Deletion

    传送门 学习来自于:http://www.cnblogs.com/Lubixiaosi-Zhaocao/p/9951711.html 题目大意: 一个无向图,各点到点1的最短距离为di,保证满足条件删 ...

  8. Codeforces 437C The Child and Toy(贪心)

    题目连接:Codeforces 437C  The Child and Toy 贪心,每条绳子都是须要割断的,那就先割断最大值相应的那部分周围的绳子. #include <iostream> ...

  9. codeforces#320(div2) D Or Game 贪心

    codeforces#320(div2) D  "Or" Game  贪心 D. "Or" Game time limit per test 2 seconds ...

最新文章

  1. 算法系列15天速成——第二天 七大经典排序【中】
  2. Tool之ping:如何使用ping命令检测电脑网络故障图文教程
  3. RequestQueue
  4. Hql中使用in参数
  5. 垃圾收集器–串行,并行,CMS,G1(以及Java 8中的新增功能)
  6. Android adb命令选择设备操作
  7. 与程序员朋友闲聊 通用权限管理系统有啥用?
  8. java QQ向另一个QQ发信息(可以是好友,也可以是非好友)
  9. xctf攻防世界web新手练习区--write up
  10. GTX1050Ti和GTX1060显卡哪个好?
  11. 大数据产品开发流程规范_大数据开发步骤和流程
  12. 高带宽数字内容保护( HDCP )介绍
  13. java xml中的冒号_带冒号的xml元素名称
  14. python1 到n_怎么用python求1到n所有整数的和
  15. 高清视频相关知识和、KMPlayer 硬解码(DXVA)设置、Z520+US15W+GMA500硬解码测试
  16. 《反脆弱:从不确定性中获益》
  17. Java SpringBoot 表单提交Json提交 Star.hou
  18. 微信小程序连接emqtt
  19. 机器学习中精确率(precision)、召回率(recall)和准确率(accuracy)的理解
  20. 解决spine升级3.8版本后与cocos不兼容。

热门文章

  1. oracle 数据 导出 excel 自动分多个文件,从oracle数据库中导出大量数据到excel中为什么自动分成了好几个excel文件《excel表格新手入门》...
  2. java的部署目录在哪里_Java:Tomcat的部署实例之资源目录
  3. SpringAMQP--发布订阅模型介绍
  4. Protobuf序列化的原理-存储格式
  5. 并发的发展历史-线程的出现
  6. mybatis-逻辑翻页
  7. 织入业务代码-ModifyService
  8. Controller 如果能保持单例,尽量使用单例
  9. 大数据神器Kafka入门
  10. 字符流复制Java文件