【图论 思维】cf715B. Complete The Graph加强
zzq讲的杂题
题目大意

有一张$n$个点$m$条边的简单正权无向图,$S$到$T$的最短路为$L$,现在有一些边的边权未知,请输出任意一种满足题意的方案。
$n,m\le 500000$.
题目分析
首先对于每一条边权未定的边,把它的边权设为1,处理出$dist_i$表示在这种情况下,$T$到$i$的最短路距离。之后再从$S$开始做dij,设$S$到$u$的最短路为$len_i$,那么当前若以$u$为起点增广一条边权未定的边$(u,v)$,就将其边权设为$\max\{1,L-len_u-dist_v\}$。最后若$T$的最短路不为$L$则无解。
关于第二次重设边权,如上处理之后在有解情况下显然第二次dij出的$len_i \le L$,那么剩下的就是考虑:可不可能把一条$L$的最短路给刷得更小了。
分步地看这个问题,我们最后一次进行重设边权操作时,等于说是钦定了一条过这个边的长度为$L$的路径(因为$len_i$是依靠重新设的边权做的最短路),也就是说一定是满足条件的最短路。反之如果这个做法无解,说明任意的未定边权的边都不在长为$L$的最短路上,那么也就没有任何影响。
注意如果(像我一样偷懒不刷完全图)那么需要判一判未经过的边。
时间复杂度:$O(n\log n)$
#include<bits/stdc++.h>
typedef long long ll;
const int maxn = ;
const int maxm = ;
const ll INF = 1000000000000000000ll; struct Edge
{
int v;
ll val;
Edge(int a=, int b=):v(a),val(b) {}
}edges[maxm];
struct node
{
int x;
ll d;
node(int a=, ll b=):x(a),d(b) {}
bool operator < (node a) const
{
return d > a.d;
}
};
int n,m,L,S,T;
int edgeTot,head[maxn],nxt[maxm];
ll dis[maxn],len[maxn];
int dfn[maxn],tim;
std::priority_queue<node> q; int read()
{
char ch = getchar();
int num = , fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
void addedge()
{
int u = read()+, v = read()+, c = read();
edges[edgeTot] = Edge(v, c), nxt[edgeTot] = head[u], head[u] = edgeTot, ++edgeTot;
edges[edgeTot] = Edge(u, c), nxt[edgeTot] = head[v], head[v] = edgeTot, ++edgeTot;
}
int main()
{
memset(head, -, sizeof head);
n = read(), m = read(), L = read(), S = read()+, T = read()+;
for (int i=; i<=m; i++) addedge();
memset(dis, 0x3f3f3f3f, sizeof dis);
tim = , q.push(node(T, )), dis[T] = ;
for (int tmp; q.size(); )
{
tmp = q.top().x, q.pop();
if (dfn[tmp]==tim) continue;
dfn[tmp] = tim;
for (int i=head[tmp]; i!=-; i=nxt[i])
{
int v = edges[i].v, c = edges[i].val?edges[i].val:;
if (dis[v] > dis[tmp]+c) dis[v] = dis[tmp]+c, q.push(node(v, dis[v]));
}
}
memset(len, 0x3f3f3f3f, sizeof len);
tim = , q.push(node(S, )), len[S] = ;
for (int tmp; q.size(); )
{
tmp = q.top().x, q.pop();
if (dfn[tmp]==tim) continue;
dfn[tmp] = tim;
if (tmp==T){
if (len[T]!=L) puts("NO");
else{
puts("YES");
for (int i=; i<=n; i++)
for (int j=head[i]; j!=-; j=nxt[j])
if (edges[j].v > i) printf("%d %d %lld\n",i-,edges[j].v-,edges[j].val?edges[j].val:INF);
}
return ;
}
for (int i=head[tmp]; i!=-; i=nxt[i])
{
if (!edges[i].val){
edges[i].val = edges[i^].val = std::max(L-len[tmp]-dis[edges[i].v], 1ll);
}
int v = edges[i].v, c = edges[i].val;
if (len[v] > len[tmp]+c) len[v] = len[tmp]+c, q.push(node(v, len[v]));
}
}
puts("NO");
return ;
}
END
【图论 思维】cf715B. Complete The Graph加强的更多相关文章
- CF715B. Complete The Graph
CF715B. Complete The Graph 题意: 给一张 n 个点,m 条边的无向图,要求设定一些边的边权 使得所有边权都是正整数,最终 S 到 T 的最短路为 L 1 ≤ n ≤ 100 ...
- 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 ...
- CodeForces 715B Complete The Graph 特殊的dijkstra
Complete The Graph 题解: 比较特殊的dij的题目. dis[x][y] 代表的是用了x条特殊边, y点的距离是多少. 然后我们通过dij更新dis数组. 然后在跑的时候,把特殊边都 ...
- Codeforces 715B. Complete The Graph 最短路,Dijkstra,构造
原文链接https://www.cnblogs.com/zhouzhendong/p/CF715B.html 题解 接下来说的“边”都指代“边权未知的边”. 将所有边都设为 L+1,如果dis(S,T ...
- 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 ...
- UESTC_小panpan学图论 2015 UESTC Training for Graph Theory<Problem J>
J - 小panpan学图论 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) S ...
- 「CF716D」Complete The Graph「最短路」
题意 给定一个\(n\)个点\(m\)条边的无向图,有一些边权暂时为\(0\),你需要分配一个\([1, 10^{18}]\)的数.最终使得\(s\)到\(t\)最短路为\(L\),输出一个可行的分配 ...
- CF716D Complete The Graph
图论+构造 首先可以发现如果去除了可以改变权值的边,$s$到$t$的最短路若小于$l$,那么一定不行 若等于则直接将可改边权的边改为inf,输出即可 那么现在原图中的最短路是大于$l$的 因为每一条边 ...
随机推荐
- httpUrlConnection连接网络的用法(用到了handle传递消息,在主线程中更新UI)
由于httpclient在Android5.0以后已经过时,所以官方推荐使用httpUrlConnection来连接网络,现将该连接的基本方法展示,如下 注意:记得加入<uses-permiss ...
- 怎么为android控件边缘添加阴影
为控件设置一个有阴影感的背景图片即可,可以使用shape 在自定义shape中增加一层或多层,并错开,即可显示阴影效果.为增加立体感,按钮按下的时候,只设置一层.我们可以通过top, bottom, ...
- Murano Weekly Meeting 2016.06.21
Meeting time: 2016.June.21 1:00~2:00 Chairperson: Kirill Zaitsev, from Mirantis Meeting summary: 1. ...
- MongoDB数据库常用操作
推荐文章 --- 一天精通MongoDB数据库 注意: monogdb数据在使用之后必须及时 mongodb.close()否则后台崩溃. 1. 删除文档中的一个字段 db.<集合名>.u ...
- c3p0 数据连接池 流行开源
注意事项:配置文件规定命名,不能更改 c3p0-config <?xml version="1.0" encoding="UTF-8"?>< ...
- 为什么阿里云服务器的docker启动tomcat这么慢??
https://blog.csdn.net/tianyiii/article/details/79314597 最近在阿里云服务器使用Docker启动Tomcat,发现tomcat服务器启动过程很慢. ...
- java多线程通过管道流实现不同线程之间的通信
java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似 ...
- vue的计算和监视属性,附一小实例
1. 计算属性 在computed属性对象中定义计算属性的方法 在页面中使用{{方法名}}来显示计算的结果 2. 监视属性: 通过通过vm对象的$watch()或watch配置来监视指定的属性 当属性 ...
- Bootstrap学习笔记(四)
四.JS插件 概述:与jQueryUI库类似,Bootstrap提供了十几个插件函数.有两种调用方法: (1) 传统JS变成方式 $(...).插件函数.(); (2) 使用data-*扩展属性(推荐 ...
- jQuery 判断文本输入框的事件
1.实现以下需求: 输入框中输入内容,发表按钮变为蓝色背景,删除为空则变为原来的颜色 代码实现:通过判断event.target.value是否为空 2.input事件:文本输入框正在输入时生效 f ...