CodeForces 715B Complete The Graph 特殊的dijkstra
题解:
比较特殊的dij的题目。
dis[x][y] 代表的是用了x条特殊边, y点的距离是多少。
然后我们通过dij更新dis数组。
然后在跑的时候,把特殊边都先当做1在跑,并且经过特殊边的时候,记得将x更新。
然后如果dis[0][t] < L 则代表不用特殊边也会小于L。所以无论是特殊的边答案是多少,dis[0][t]<L也是固定的。
然后我们不断检查dis[c][t] (for c 1 to N) 是不是 <= L 。
找到对应的dis[c][t]之后, 把最短路上的特殊边更新成符合答案的值。 其他特殊边更新成L+1。
代码从学长那里学的, 可以说十分像了。
对我来说比较新颖的是, 把边初始值赋值为L+1,这样就可以在int的范围内跑完全程的dij了, 毕竟如果路径长度 > L 之后就没必要再跑了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll; const int inf = 0x3f3f3f3f;
const int _inf = 0xc0c0c0c0;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL _INF = 0xc0c0c0c0c0c0c0c0;
const LL mod = (int)1e9+;
const int N = 1e3 + ;
const int M = 2e4 + ;
int n, m, L, s, t;
int head[N], to[M], val[M], nt[M], tot;
void add(int u, int v, int w){
to[tot] = v;
val[tot] = w;
nt[tot] = head[u];
head[u] = tot++;
}
int dis[N][N];
pll pre[N][N];
typedef tuple<int,int,int> tup;
priority_queue<tup, vector<tup>, greater<tup> > pq;
bool dij(){
for(int i = ; i < N; ++i)
fill(dis[i], dis[i] + N, L+);
dis[][s] = ;
pq.push(tup(,,s));
/// dis , 0-edge, now-point
while(!pq.empty()){
int dd, c, u;
tie(dd, c, u) = pq.top();
pq.pop();
if(dd != dis[c][u]) continue;
for(int i = head[u]; ~i; i = nt[i]){
int v = to[i];
int w = dd + val[i] + (!val[i]);
int nc = c + (!val[i]);
if(nc >= N) continue;
if(dis[nc][v] > w){
dis[nc][v] = w;
pq.push(tup(w, nc, v));
pre[nc][v] = pll(u, i);
}
}
}
if(dis[][t] < L) return false;
if(dis[][t] == L) return true;
for(int c = ; c < N; ++c){
if(dis[c][t] <= L){
int add = L - dis[c][t];
int cc = c, now = t;
while(now != s){
pll tt = pre[cc][now];
now = tt.fi;
if(val[tt.se] == ){
val[tt.se] = val[tt.se^] = add + ;
add = ;
cc--;
}
}
return true;
}
}
return false;
}
int main(){
memset(head, -, sizeof head);
scanf("%d%d%d%d%d", &n, &m, &L, &s, &t);
int u, v, w;
for(int i = ; i <= m; ++i){
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
if(dij()){
puts("YES");
for(int i = ; i < tot; i += ){
if(val[i] == ) val[i] = L + ;
printf("%d %d %d\n", to[i], to[i^], val[i]);
}
}
else puts("NO");
return ;
}
CodeForces 715B Complete The Graph 特殊的dijkstra的更多相关文章
- Codeforces 715B. Complete The Graph 最短路,Dijkstra,构造
原文链接https://www.cnblogs.com/zhouzhendong/p/CF715B.html 题解 接下来说的“边”都指代“边权未知的边”. 将所有边都设为 L+1,如果dis(S,T ...
- 715B Complete The Graph
传送门 题目大意 给出一个图,一些边带权,另一些边等待你赋权(最小赋为1).请你找到一种赋权方式,使得 s 到 t 的最短路为 L n ≤ 1e3 ,m ≤ 1e4 ,L ≤ 1e9 分析 二分所有边 ...
- Codeforces 715B & 716D Complete The Graph 【最短路】 (Codeforces Round #372 (Div. 2))
B. Complete The Graph time limit per test 4 seconds memory limit per test 256 megabytes input standa ...
- 【Codeforces】716D Complete The Graph
D. Complete The Graph time limit per test: 4 seconds memory limit per test: 256 megabytes input: sta ...
- ACM - 最短路 - CodeForces 295B Greg and Graph
CodeForces 295B Greg and Graph 题解 \(Floyd\) 算法是一种基于动态规划的算法,以此题为例介绍最短路算法中的 \(Floyd\) 算法. 我们考虑给定一个图,要找 ...
- Codeforces 459E Pashmak and Graph(dp+贪婪)
题目链接:Codeforces 459E Pashmak and Graph 题目大意:给定一张有向图,每条边有它的权值,要求选定一条路线,保证所经过的边权值严格递增,输出最长路径. 解题思路:将边依 ...
- CF715B. Complete The Graph
CF715B. Complete The Graph 题意: 给一张 n 个点,m 条边的无向图,要求设定一些边的边权 使得所有边权都是正整数,最终 S 到 T 的最短路为 L 1 ≤ n ≤ 100 ...
- codeforces 372 Complete the Word(双指针)
codeforces 372 Complete the Word(双指针) 题链 题意:给出一个字符串,其中'?'代表这个字符是可变的,要求一个连续的26位长的串,其中每个字母都只出现一次 #incl ...
- codeforces 715B:Complete The Graph
Description ZS the Coder has drawn an undirected graph of n vertices numbered from 0 to n - 1 and m ...
随机推荐
- 整理github总结
之前记述过两篇关于git命令的随笔,那时候对git的理解还不太深(虽然现在理解的也不是很多...菜哭了),只会用那些命令,并没有形成自己的知识,今天下载完Git之后,规整了一下自己的github,在吃 ...
- ubuntu搭建环境
1.终端输入 sudo apt- add-apt-repository ppa:ondrej/php sudo add-apt-repository ppa:ondrej/php sudo apt ...
- Docker 容器高级操作[Docker 系列-3]
关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 上篇文章向读者介绍了一个 Nginx 的例子,对于 Nginx 这样一个容器而言,当它启动成功后,我们 ...
- 新IT运维时代 | Docker运维之最佳实践-上篇
容器技术的发展可以分为两个阶段,第一个阶段聚焦在IaaS层,仅仅把容器当做更轻量级虚拟机来使用,解决了应用运行时进程级资源隔离的问题:随着Docker的出现,容器虚拟化才有了统一的平台,由此容器技术发 ...
- Android:JNI与NDK(三)NDK构建的脚本文件配置
友情提示:欢迎关注本人公众号,那里有更好的阅读体验以及第一时间获取最新文章 本文目录 一.前言 本篇我们介绍Android.mk与CMakeLists.txt构建NDK的配置文件,我们知道目前NDK的 ...
- Linux下安装jupyter
又是美好的一天 开开心心写代码 1. 安装ipython, jupyter pip install ipython pip install jupyter 2. 生成配置文件[root@50e ...
- powerdesign进军(二)--oracle数据源配置
目录 资源下载(oracle客户端) 配置 查看系统的数据源 powerdesign 连接数据库 title: powerdesign进军(二)--oracle数据源配置 date: 2019-05- ...
- 常用maven 命令
重新依赖:mvn package -U -DskipTest=true; 在本地安装jar包:mvn install 清除产生的项目:mvn clean 运行测试:mvn test 上传到私服:mvn ...
- mysql根据逗号将一行数据拆分成多行数据
mysql根据逗号将一行数据拆分成多行数据 原始数据 处理结果展示 DDL CREATE TABLE `company` ( `id` ) DEFAULT NULL, `name` ) DEFAULT ...
- Day 01--选题与设计(一)
1.第一天我们主要确定了软件课设的项目,做一个学校内食堂订送餐的微信小程序.我们大体的设计思路是:可以实现学生身份的认证,幷使学生们能自行选择校园内的食堂,挑选各个食堂各个窗口菜谱上可以选择的菜,选择 ...