CodeForces - 1076D Edge Deletion(最短路+贪心/最短路树+bfs)
题目链接:点击查看
题目大意:给出一张 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)相关推荐
- bzoj3694:最短路(最短路树+并查集)
3694:最短路 时间限制: 1000 ms 内存限制: 262144 KB 题目描述 给出一个 n n n个点m" role="presentation" style= ...
- Edge Deletion CodeForces - 1076D(水最短路)
题意: 设从1到每个点的最短距离为d,求删除几条边后仍然使1到每个点的距离为d,使得剩下的边最多为k 解析: 先求来一遍spfa,然后bfs遍历每条路,如果d[v] == d[u] + Node[i] ...
- 【CodeForces Round #550】A-F | 模拟 | 贪心 | 高精 | BFS | 二分图 | E
今年怎么没有愚人节比赛了 CF你看看人家洛谷 唉鸭原来那边还没到愚人节呢- 愚人节比赛还是有的,在今晚 qwq [CodeForces 1144 A-F] Tags:模拟 贪心 BFS 高 ...
- Educational Codeforces Round 54 (Rated for Div. 2): D. Edge Deletion(最短路树)
题意: 给你n个点m条边的无向图,其中1号节点是市中心,你现在最多只能保留k条边,并要求所有点到市中心的最短路尽量不变(也就是说设点i到点1的最短路为di,那么删边之后,要保证尽可能多的点,它到1的最 ...
- 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 ...
- 【CodeForces - 545 ABCDE套题训练题解】贪心, 构造,模拟,dp,最短路树(Dijkstra+变形)
A: 题干: Input The first line contains integer n (1 ≤ n ≤ 100) - the number of cars. Each of the next ...
- (Div.2)D. Edge Deletion
传送门 学习来自于:http://www.cnblogs.com/Lubixiaosi-Zhaocao/p/9951711.html 题目大意: 一个无向图,各点到点1的最短距离为di,保证满足条件删 ...
- Codeforces 437C The Child and Toy(贪心)
题目连接:Codeforces 437C The Child and Toy 贪心,每条绳子都是须要割断的,那就先割断最大值相应的那部分周围的绳子. #include <iostream> ...
- codeforces#320(div2) D Or Game 贪心
codeforces#320(div2) D "Or" Game 贪心 D. "Or" Game time limit per test 2 seconds ...
最新文章
- 算法系列15天速成——第二天 七大经典排序【中】
- Tool之ping:如何使用ping命令检测电脑网络故障图文教程
- RequestQueue
- Hql中使用in参数
- 垃圾收集器–串行,并行,CMS,G1(以及Java 8中的新增功能)
- Android adb命令选择设备操作
- 与程序员朋友闲聊 通用权限管理系统有啥用?
- java QQ向另一个QQ发信息(可以是好友,也可以是非好友)
- xctf攻防世界web新手练习区--write up
- GTX1050Ti和GTX1060显卡哪个好?
- 大数据产品开发流程规范_大数据开发步骤和流程
- 高带宽数字内容保护( HDCP )介绍
- java xml中的冒号_带冒号的xml元素名称
- python1 到n_怎么用python求1到n所有整数的和
- 高清视频相关知识和、KMPlayer 硬解码(DXVA)设置、Z520+US15W+GMA500硬解码测试
- 《反脆弱:从不确定性中获益》
- Java SpringBoot 表单提交Json提交 Star.hou
- 微信小程序连接emqtt
- 机器学习中精确率(precision)、召回率(recall)和准确率(accuracy)的理解
- 解决spine升级3.8版本后与cocos不兼容。