图论+构造

首先可以发现如果去除了可以改变权值的边,$s$到$t$的最短路若小于$l$,那么一定不行

若等于则直接将可改边权的边改为inf,输出即可

那么现在原图中的最短路是大于$l$的

因为每一条边是都要加入图中的,而且每条边边权至少为1

那么可以不断向图中加入权值为1的边,并且在加边的过程中不断跑最短路

如果加完当前的边,$s$到$t$的最短路小于l的话,将这条边权值增加

剩下的边边权改为inf即可

简单证明这种做法

首先考虑加入1边后,最短路依然大于$l$,那么继续使最短路减小

再考虑加入1边后,最短路小于$l$

因为在加入这条边之前最短路大于$l$,那么加入这条边后,最短路肯定经过这条边

而增加边权之后,最短路还是比之前的小,那么最短依然经过这条边

不会出现增加了这条边的边权之后,最短路不经过这条边的情况

那么得到的图最短路必定为$l$

#include <bits/stdc++.h>
#define ll long long
#define inf (ll)1e17;
using namespace std;
const int MAXN=20100;
int n,m,l,s,t,tot;
int first[1100],nxt[MAXN],point[MAXN];
int vi[1100];
ll d[1100],len[MAXN];
struct node
{
int u,v;
ll l;
}sh[MAXN];
void add_edge(int x,int y,int z)
{
tot++;
nxt[tot]=first[x];
first[x]=tot;
point[tot]=y;
len[tot]=z;
}
void spfa()//最短路
{
queue <int> q;
for (int i=0;i<n;i++)
d[i]=inf;
d[s]=0;
vi[s]=1;
q.push(s);
while (!q.empty())
{
int f;
f=q.front();
q.pop();
vi[f]=0;
for (int i=first[f];i!=-1;i=nxt[i])
{
int u;
u=point[i];
if (d[u]>d[f]+len[i])
{
d[u]=d[f]+len[i];
if (!vi[u])
{
vi[u]=1;
q.push(u);
}
}
}
}
}
int main()
{
tot=-1;
memset(first,-1,sizeof(first));
memset(nxt,-1,sizeof(nxt));
scanf("%d%d%d%d%d",&n,&m,&l,&s,&t);
for (int i=1;i<=m;i++)
{
scanf("%d%d%lld",&sh[i].u,&sh[i].v,&sh[i].l);
if (sh[i].l==0)
continue;
add_edge(sh[i].u,sh[i].v,sh[i].l);
add_edge(sh[i].v,sh[i].u,sh[i].l);
}
spfa();
if (d[t]<l)
{
printf("NO\n");
return 0;
}
if (d[t]==l)//注意
{
printf("YES\n");
for (int i=1;i<=m;i++)
{
if (sh[i].l==0)
sh[i].l=inf;
printf("%d %d %lld\n",sh[i].u,sh[i].v,sh[i].l);
}
return 0;
}
int wh;
for (int i=1;i<=m;i++)
{
if (sh[i].l==0)
{
add_edge(sh[i].u,sh[i].v,1);
add_edge(sh[i].v,sh[i].u,1);
spfa();
if (d[t]>l)
{
sh[i].l=1;
continue;
}
sh[i].l=1+l-d[t];
wh=i;
break;
}
}
tot=-1;
memset(first,-1,sizeof(first));
memset(nxt,-1,sizeof(nxt));
for (int i=wh+1;i<=m;i++)
{
if (sh[i].l==0)
sh[i].l=inf;
}
for (int i=1;i<=m;i++)
{
add_edge(sh[i].u,sh[i].v,sh[i].l);
add_edge(sh[i].v,sh[i].u,sh[i].l);
}
spfa();
if (d[t]!=l)
{
printf("NO\n");
return 0;
}
printf("YES\n");
for (int i=1;i<=m;i++)
printf("%d %d %lld\n",sh[i].u,sh[i].v,sh[i].l);
}

CF716D Complete The Graph的更多相关文章

  1. 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 ...

  2. CF715B. Complete The Graph

    CF715B. Complete The Graph 题意: 给一张 n 个点,m 条边的无向图,要求设定一些边的边权 使得所有边权都是正整数,最终 S 到 T 的最短路为 L 1 ≤ n ≤ 100 ...

  3. 【Codeforces】716D Complete The Graph

    D. Complete The Graph time limit per test: 4 seconds memory limit per test: 256 megabytes input: sta ...

  4. CodeForces 715B Complete The Graph 特殊的dijkstra

    Complete The Graph 题解: 比较特殊的dij的题目. dis[x][y] 代表的是用了x条特殊边, y点的距离是多少. 然后我们通过dij更新dis数组. 然后在跑的时候,把特殊边都 ...

  5. 「CF716D」Complete The Graph「最短路」

    题意 给定一个\(n\)个点\(m\)条边的无向图,有一些边权暂时为\(0\),你需要分配一个\([1, 10^{18}]\)的数.最终使得\(s\)到\(t\)最短路为\(L\),输出一个可行的分配 ...

  6. 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 ...

  7. Codeforces 715B. Complete The Graph 最短路,Dijkstra,构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF715B.html 题解 接下来说的“边”都指代“边权未知的边”. 将所有边都设为 L+1,如果dis(S,T ...

  8. Codeforces Round #372 (Div. 1) B. Complete The Graph (枚举+最短路)

    题目就是给你一个图,图中部分边没有赋权值,要求你把无权的边赋值,使得s->t的最短路为l. 卡了几周的题了,最后还是经群主大大指点……做出来的…… 思路就是跑最短路,然后改权值为最短路和L的差值 ...

  9. Codeforces715 B. Complete The Graph

    传送门:>Here< 题意:给出一张带权无向图,其中有一些边权为0.要求将边权为0的边的边权重置为一个任意的正整数,使得从S到T的最短路为L.判断是否存在这种方案,如果存在输出任意一种 解 ...

随机推荐

  1. NodeJS二进制合并

    Node.js 批量文件合并code cnblogs @ Orcim  本 文主要介绍使用 Node 进行 ACB 序列文件(Atom CueSheet Binary,编译 AtomCueSheet ...

  2. SQL实战——03. 查找各个部门当前(to_date='9999-01-01')领导当前薪水详情以及其对应部门编号dept_no

    查找各个部门当前(to_date='9999-01-01')领导当前薪水详情以及其对应部门编号dept_noCREATE TABLE `dept_manager` (`dept_no` char(4) ...

  3. MFC 简介

    参考:https://baike.baidu.com/item/MFC/2236974 MFC (微软基础类库) 编辑 锁定 讨论999   MFC(Microsoft Foundation Clas ...

  4. JDBC Java 程序从 MySQL 数据库中读取数据,并备份到 xml 文档中

    MySQL 版本:Server version: 5.7.17-log MySQL Community Server (GPL) 相关内容:JDBC Java 程序从 MySQL 数据库中读取数据,并 ...

  5. CSG:清华大学提出通过分化类特定卷积核来训练可解释的卷积网络 | ECCV 2020 Oral

    论文提出类特定控制门CSG来引导网络学习类特定的卷积核,并且加入正则化方法来稀疏化CSG矩阵,进一步保证类特定.从实验结果来看,CSG的稀疏性能够引导卷积核与类别的强关联,在卷积核层面产生高度类相关的 ...

  6. OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...

  7. Vue:Vue-Cli 实现的交互式的项目脚手架

    一.这份文档是对应 @vue/cli.老版本的 vue-cli 文档请移步https://github.com/vuejs/vue-cli/tree/v2#vue-cli-- Vue CLI 是一个基 ...

  8. antd pro 路由

    概要 antd pro 路由简介 路由, 菜单和面包屑 页面之间的路由 带参数的路由 总结 概要 路由配置是单页应用的核心之一, antd pro 将所有的路由配置集中在一个文件中, 可以更好的对应用 ...

  9. 福州11911.562(薇)xiaojie:福州哪里有xiaomei

    福州哪里有小姐服务大保健[微信:11911.562倩儿小妹[福州叫小姐服务√o服务微信:11911.562倩儿小妹[福州叫小姐服务][十微信:11911.562倩儿小妹][福州叫小姐包夜服务][十微信 ...

  10. 还不会ida*算法?看完这篇或许能理解点。

    IDA* 算法分析 IDA* 本质上就是带有估价函数和迭代加深优化的dfs与,A * 相似A *的本质便是带 有估价函数的bfs,估价函数是什么呢?估价函数顾名思义,就是估计由目前状态达 到目标状态的 ...