【图论 思维】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$的 因为每一条边 ...
随机推荐
- 牛客网Java刷题知识点之什么是单例模式?解决了什么问题?饿汉式单例(开发时常用)、懒汉式单例(面试时常用)、单例设计模式的内存图解
不多说,直接上干货! 什么是单例设计模式? 解决的问题:可以保证一个类在内存中的对象唯一性,必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性. 如何保证? 1.不允许其他程序用new ...
- JS arguments转array
JS arguments转array? Array.prototype.slice.call(arguments)
- http学习总结及思考
针对前面几章的学习,加上在学长的指导下,希望对前面知识进行简单总结. 1.在报文的7个方法中,最常用的是:Head和Post 响应头:If-Modified-Since HEAD -> 服务器返 ...
- 几个CSS的黑科技
这里的黑科技其实就是一些CSS中不怎么为人所知但在解决某些问题的时候很溜的属性. border-radius 很多开发者估计都没有正确认识这个border-radius,因为基本上很多人都是这么用的: ...
- Spring Boot实战(2) Spring常用配置
1. Bean的Scope scope描述Spring容器如何新建Bean的实例.通过注解@Scope实现,取值有: a. Singleton:一个Spring容器中只有一个Bean的实例.此为Spr ...
- 关于webform textbox Password 模式
textbox在这个模式时,如果进行点击按钮或者其他与后台交互的操作,则状态不会保留,既密码框内容会被清空: 这个可以在前台使用 隐藏控件加js获取密码框内容赋值到隐藏控件,点击刷新后通过后台为密码框 ...
- Vue Element-ui 框架:路由设置 限制文件类型 表单验证 回车提交 注意事项 监听事件
1.验证上传文件的类型: (1)验证图片类型 <template> <el-upload class="avatar-uploader" action=" ...
- display详细说明
display:block,inline,inline-block区别 display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可 ...
- http-equiv和name的区别
meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta 标签用于网页的<head>与</head>中,meta 标签的用处很多.meta 的属性有两种:name和 ...
- 对react vd 性能的理解
相信大家都知道react vd的性能是很好的,速度挺快的,真实dom操作很慢的,但是结果完全相反: 后来我就做了个测试,从两个方面去测试,在页面初始渲染1w条数据,react渲染耗时超过了1秒 在12 ...