博客
关于我
CodeForces - 1076D Edge Deletion(最短路径树 / dijkstra+贪心)
阅读量:610 次
发布时间:2019-03-12

本文共 4041 字,大约阅读时间需要 13 分钟。

题目链接:

题目大意:

给一个 n n n 个点, m m m 条边的无向简单带权连通图, 要求删边至最多剩余 k k k 条边.
定义"好点"是指删边后, 1 1 1 号节点到它的最短路长度仍然等于原图最短路长度的节点.
最大化删边后的好点个数

题目分析:

思路1:
d i j k s t r a dijkstra dijkstra 算法建出最短路径树,在树上跑 k k k 条边一定符合答案的最优性,因为每加一条树上的边就会多保留一个点,所以直接 b f s bfs bfs 跑一下就可以了
思路2:
因为要保证每加一条边尽可能的多一个点,而 d i j k s t r a dijkstra dijkstra 算法就是一个贪心的过程,所以可以累计 k k k 次松弛操作,这 k k k 条边一定是最优的

具体细节见代码:

思路一:最短路径树

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define inf 0x3f3f3f3f#define int llusing namespace std;int read(){ int res = 0,flag = 1; char ch = getchar(); while(ch<'0' || ch>'9') { if(ch == '-') flag = -1; ch = getchar(); } while(ch>='0' && ch<='9') { res = (res<<3)+(res<<1)+(ch^48);//res*10+ch-'0'; ch = getchar(); } return res*flag;}const int maxn = 3e5+5;const int mod = 1e9+7;const double pi = acos(-1);const double eps = 1e-8;struct Edge { int nxt,to,val,id;}edge[maxn<<1];int n,m,k,head[maxn],cnt,dis[maxn],pre[maxn],id[maxn]; //id[i]表示扩展到i的边的编号 bool vis[maxn];void addedge(int from,int to,int val,int id){ edge[++cnt].nxt = head[from]; edge[cnt].to = to; edge[cnt].val = val; edge[cnt].id = id; head[from] = cnt;}void dijkstra(int u){ priority_queue
,vector
>,greater
>>qu; memset(dis,inf,sizeof(dis)); dis[u] = 0; qu.push(make_pair(0,u)); while(!qu.empty()) { int h = qu.top().second; qu.pop(); if(vis[h]) continue; vis[h] = true; for(int i = head[h];i;i = edge[i].nxt) { int to = edge[i].to,val = edge[i].val; if(dis[to] == dis[h]+val && edge[pre[to]].val > val) { pre[to] = h; id[to] = edge[i].id; } if(dis[to] > dis[h]+val) { pre[to] = h; id[to] = edge[i].id; dis[to] = dis[h]+val; qu.push(make_pair(dis[to],to)); } } }}vector
nod[maxn],e;void bfs(int u){ queue
qu; qu.push(u); while(!qu.empty() && (int)e.size() <= k) { int h = qu.front(); qu.pop(); e.push_back(id[h]); for(auto to : nod[h]) qu.push(to); }}signed main(){ n = read(),m = read(),k = read(); for(int i = 1;i <= m;i++) { int from = read(),to = read(),val = read(); addedge(from,to,val,i); addedge(to,from,val,i); } dijkstra(1); for(int i = 2;i <= n;i++) //建树 nod[pre[i]].push_back(i); bfs(1); printf("%d\n",(int)e.size()-1); for(int i = 1;i < (int)e.size();i++) printf("%d ",e[i]); return 0;}

思路二: d i j k s t r a dijkstra dijkstra 算法+贪心

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define inf 0x3f3f3f3f#define int llusing namespace std;int read(){ int res = 0,flag = 1; char ch = getchar(); while(ch<'0' || ch>'9') { if(ch == '-') flag = -1; ch = getchar(); } while(ch>='0' && ch<='9') { res = (res<<3)+(res<<1)+(ch^48);//res*10+ch-'0'; ch = getchar(); } return res*flag;}const int maxn = 3e5+5;const int mod = 1e9+7;const double pi = acos(-1);const double eps = 1e-8;struct Edge { int nxt,to,val,id;}edge[maxn<<1];int n,m,k,head[maxn],cnt,dis[maxn],pre[maxn],id[maxn]; //id[i]表示扩展到i的边的编号 bool vis[maxn];void addedge(int from,int to,int val,int id){ edge[++cnt].nxt = head[from]; edge[cnt].to = to; edge[cnt].val = val; edge[cnt].id = id; head[from] = cnt;}vector
e;struct node{ int dis,to,id; node(int a,int b,int c) { dis = a,to = b,id = c; } bool operator < (const node &b)const { return dis > b.dis; }};void dijkstra(int u){ priority_queue
qu; memset(dis,inf,sizeof(dis)); dis[u] = 0; qu.push(node(0,u,-1)); while(!qu.empty() && (int)e.size() <= k) { int h = qu.top().to; node now = qu.top(); qu.pop(); if(vis[h]) continue; vis[h] = true; e.push_back(now.id); for(int i = head[h];i;i = edge[i].nxt) { int to = edge[i].to,val = edge[i].val; if(dis[to] > dis[h]+val) { dis[to] = dis[h]+val; qu.push(node(dis[to],to,edge[i].id)); } } }}signed main(){ n = read(),m = read(),k = read(); for(int i = 1;i <= m;i++) { int from = read(),to = read(),val = read(); addedge(from,to,val,i); addedge(to,from,val,i); } dijkstra(1); printf("%d\n",(int)e.size()-1); for(int i = 1;i < (int)e.size();i++) printf("%d ",e[i]); return 0;}

转载地址:http://ghrxz.baihongyu.com/

你可能感兴趣的文章
Nginx:现代Web服务器的瑞士军刀 | 文章末尾送典藏书籍
查看>>
ngModelController
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
Nhibernate的第一个实例
查看>>
NHibernate示例
查看>>
nid修改oracle11gR2数据库名
查看>>
NIFI1.21.0/NIFI1.22.0/NIFI1.24.0/NIFI1.26.0_2024-06-11最新版本安装_采用HTTP方式_搭建集群_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
查看>>
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>