Codeforces 715B. Complete The Graph 最短路,Dijkstra,构造
原文链接https://www.cnblogs.com/zhouzhendong/p/CF715B.html
题解
接下来说的“边”都指代“边权未知的边”。
将所有边都设为 L+1,如果dis(S,T) < L ,那么必然无解。
将所有边都设为 1 ,如果 dis(S,T) > L ,那么必然无解。
考虑将任意一条边的权值+1,则 dis(S,T) 会 +0 或者 +1 。
如果将所有边按照某一个顺序不断+1,直到所有边的权值都是L+1了,那么在这个过程中,dis(S,T) 是递增的,而且一定在某一个时刻 dis(S,T) = L。
这样的话我们就可以二分答案+dijkstra解决这个问题了。
时间复杂度 $O(n\log (n+m) \log (mL))$ 。
事实上有更优秀的做法(我并没有想到),懒得写了,给个链接:
https://blog.csdn.net/aufeas/article/details/52916704
代码
#include <bits/stdc++.h>
#define clr(x) memset(x,0,sizeof (x))
using namespace std;
typedef long long LL;
#define pii pair <int,int>
LL read(){
LL x=0,f=0;
char ch=getchar();
while (!isdigit(ch))
f|=ch=='-',ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int N=1005,M=10005,INF=1e9+5;
int n,m,L,S,T;
struct Edge{
int x,y,z;
}e[M];
struct Graph{
int cnt,y[M*2],z[M*2],nxt[M*2],fst[N];
void clear(){
cnt=1,clr(fst);
}
void add(int a,int b,int c){
y[++cnt]=b,nxt[cnt]=fst[a],fst[a]=cnt,z[cnt]=c;
}
void update(int id,int v){
z[id<<1]=z[id<<1|1]=v;
}
}g;
vector <int> eid;
int dis[N],vis[N];
int Dijkstra(){
static priority_queue <pii,vector <pii>,greater <pii> > Q;
while (!Q.empty())
Q.pop();
for (int i=1;i<=n;i++)
dis[i]=INF,vis[i]=0;
dis[S]=0;
Q.push(make_pair(dis[S],S));
while (!Q.empty()){
pii p=Q.top();
Q.pop();
int x=p.second;
if (vis[x]||dis[x]!=p.first)
continue;
vis[x]=1;
for (int i=g.fst[x];i;i=g.nxt[i]){
int y=g.y[i],z=g.z[i];
if (!vis[y]&&dis[x]+z<dis[y]){
dis[y]=dis[x]+z;
Q.push(make_pair(dis[y],y));
}
}
}
return dis[T];
}
int check(LL v){
for (auto i : eid){
LL d=min(v,(LL)L);
g.update(i,d+1);
v-=d;
}
return Dijkstra()<=L;
}
int main(){
n=read(),m=read(),L=read(),S=read()+1,T=read()+1;
g.clear();
for (int i=1;i<=m;i++){
int x=read()+1,y=read()+1,z=read();
e[i].x=x,e[i].y=y,e[i].z=z;
g.add(x,y,z);
g.add(y,x,z);
if (!z)
eid.push_back(i);
}
for (auto i : eid)
g.update(i,INF);
if (Dijkstra()<L)
return puts("NO"),0;
for (auto i : eid)
g.update(i,1);
if (Dijkstra()>L)
return puts("NO"),0;
LL l=0,r=(LL)L*(int)eid.size(),mid,ans=l;
while (l<=r){
mid=(l+r)>>1;
if (check(mid))
l=mid+1,ans=mid;
else
r=mid-1;
}
for (auto i : eid){
LL d=min(ans,(LL)L);
e[i].z=d+1;
ans-=d;
}
puts("YES");
for (int i=1;i<=m;i++)
printf("%d %d %d\n",e[i].x-1,e[i].y-1,e[i].z);
return 0;
}
Codeforces 715B. Complete The Graph 最短路,Dijkstra,构造的更多相关文章
- CodeForces 715B Complete The Graph 特殊的dijkstra
Complete The Graph 题解: 比较特殊的dij的题目. dis[x][y] 代表的是用了x条特殊边, y点的距离是多少. 然后我们通过dij更新dis数组. 然后在跑的时候,把特殊边都 ...
- Codeforces.567E.President and Roads(最短路 Dijkstra)
题目链接 \(Description\) 给定一张有向图,求哪些边一定在最短路上.对于不一定在最短路上的边,输出最少需要将其边权改变多少,才能使其一定在最短路上(边权必须为正,若仍不行输出NO). \ ...
- Codeforces.1051F.The Shortest Statement(最短路Dijkstra)
题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚 ...
- Codeforces Gym101502 I.Move Between Numbers-最短路(Dijkstra优先队列版和数组版)
I. Move Between Numbers time limit per test 2.0 s memory limit per test 256 MB input standard inpu ...
- 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 ...
- ACM - 最短路 - CodeForces 295B Greg and Graph
CodeForces 295B Greg and Graph 题解 \(Floyd\) 算法是一种基于动态规划的算法,以此题为例介绍最短路算法中的 \(Floyd\) 算法. 我们考虑给定一个图,要找 ...
- 【Codeforces】716D Complete The Graph
D. Complete The Graph time limit per test: 4 seconds memory limit per test: 256 megabytes input: sta ...
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...
随机推荐
- ubuntu16.04下sublime text3安装和配置
ubuntu16.04下sublime text3安装和配置 2018年04月20日 10:31:08 zhengqijun_ 阅读数:1482 1.安装方法 1)使用ppa安装 sudo add-a ...
- php中fastcgi和php-fpm是什么东西
参考和学习了以下文章: 1. mod_php和mod_fastcgi和php-fpm的介绍,对比,和性能数据 2. 实战Nginx_取代 为了如何一步步的引出fastcgi和php-fpm,我先一点一 ...
- 安装 R 包报错 clang: error: unsupported option '-fopenmp' 的解决方法
MacOS 上安装 R 包 install.packages("data.table") 后面提示是否安装需要编译的版本: Do you want to install from ...
- c语言计算过程中的过程转换
graph BT float==>double; id1[char, short]==>int; int-->unsigned unsigned-->long long--&g ...
- vue---slot,slot-scoped,以及2.6版本之后插槽的用法
slot 插槽 ,是用在组件中,向组件分发内容.它的内容可以包含任何模板代码,包括HTML. vue 在 2.6.0 中,具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令).它取 ...
- C# 执行DOS命令和批处理
在项目开发中,有时候要处理一些文件,比如视频格式的转换,如果用C开发一套算法,再用C#调用,未免得不偿失!有时候调用现有的程序反而更加方便.今天就来说一下C#中如何调用外部程序,执行一些特殊任务. 这 ...
- CSS布局 两列布局之单列定宽,单列自适应布局思路
前言 说起自适应布局方式,单列定宽单列自适应布局是最基本的布局形式.比如斗鱼的直播间,后台管理系统都是常用的 我们将从 float, inline-block, table, absolute, fl ...
- [物理学与PDEs]第5章习题10 多凸函数一个例子
证明函数 $$\bex \hat W({\bf F})=\sedd{\ba{ll} \cfrac{1}{\det{\bf F}},&if\ \det{\bf F}>0,\\ +\inft ...
- [物理学与PDEs]第2章第2节 粘性流体力学方程组 2.4 粘性热传导流体动力学方程组
粘性热传导流体动力学方程组: $$\beex \bea \cfrac{\p \rho}{\p t}+\Div(\rho{\bf u})&=0,\\ \rho \cfrac{\rd {\bf u ...
- make: 警告:检测到时钟错误。您的创建可能是不完整的。
问题: make: 警告:检测到时钟错误.您的创建可能是不完整的. 原因:1. 文件时间不一致.(或者修改了系统时间) 如何解决:你touch *一下,然后重新编译 touch * touch命令有两 ...