题目链接:传送门

题目大意:给你一副无向图,边有权值,初始权值>=0,若权值==0,则需要把它变为一个正整数(不超过1e18),现在问你有没有一种方法,

     使图中的边权值都变为正整数的时候,从 S 到 T 的最短路恰好等于 L。

     若没有输出 "NO",否则输出 "YES",同时输出新图中的所有边权值。

题目思路:二分+最短路(spfa or dijkstra)

     

闲谈:先%一发杜教,思路来源于看他的代码。然后蒟蒻spfa 982ms,杜教 dijkstra 93ms(毕竟1000个点,严格nlogn,spfa不稳定)

详细方法:

     以下把题目中权值为0 的边称为 重构边 ,

             无穷大设为1e9+1(因为 L 最大1e9,所以只要重构边权值为1e9+1,则任何经过该重构边的路径均不合法,因为>L)

     题目要求所有边都要为正,那么我们验证时首先验证 重构边 权值为 1 的情况。

        若此时从 S 到 T 的最短路 >L,则为NO

        因为我们在题目要求范围里无法找到一条路径使 S 到 T 的最短路更短,所以不成立

     再验证所有重构边 权值为 无穷大的情况。

        若此时从 S 到 T 的最短路 <L,同样为NO

        因为重构边设为无穷大之后,最短路只会走原图上的 非重构边,而这些边权值是不能改变的,及时重构边边权减小,

        也只会使 最短路变得更短,所以不合法

     这就是不合法的情况,除此之外的所有情况都会找到一种重构方法使题目有解。

     上面第一种方法如果最短路<L,则可通过增加重构边边权的方法使最短路==L,第二种情况同理可减小边权使之成立

分割线/***----------------------------------------------------------------------------------------------------------------------***/

    现在是如何找到一种边权分配方法使最短路==L

    首先我们要弄明白一个结论

        1.如果最短路不经过重构边(对应上面第二种情况)且最短路恰等于L,则重构边边权任意正整数。

        2.如果最短路经过重构边{

          无论最短路==L的路径有多少条,我们只需找到一条路径即可,其他路径上的重构边权值就算设为无穷大

          对题目没有影响(因为已经找到一条)。我们只需要把选好的这条路径上的重构边边权设置好就行。

        }

        那么怎样设置边权?

        可能你会问为什么不先找一条路径?其实我们只需要不断给每条边分配边权并且匹配最短路是否合法就行。

        也就是说我们给每条重构边机会,如果不行,把它设为无穷大,否则分配边权给它看它是否能满足我们最短路的要求。

        这样会很简单也不会出错。

        设置边权的过程用二分来实现,二分的值是所有边的权值总和。然后从给每一条边分配权值,如果最短路==L,则成功

        否则如果最短路<L,增加边权。如果最短路>L,减少边权。

        最短路用 spfa or dijkstra 即可。此题点少,dijkstra很快。

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 1005050
#define maxn 20005
typedef pair<int,int> PII;
typedef long long LL; int n,m,k,x,y,v;
int S,T,L;
int head[N],hcnt;
struct Node{
int to,nxt,v;
}node[maxn];
int d[N],vis[N],s[maxn];
vector<int>eg; ///存重构边
queue<int>q;
int spfa(){
for(int i=;i<n;++i) d[i]=(int)1e9+; d[S]=;
mst(vis,); q.push(S);
while(!q.empty()){
int x=q.front();q.pop(); vis[x]=;
for(int i=head[x];~i;i=node[i].nxt){
int e=node[i].to;
if(d[e]>d[x]+node[i].v){
d[e]=d[x]+node[i].v;
if(!vis[e]){vis[e]=;q.push(e);}
}
}
}
return d[T];
}
int check(LL sum){ ///判断是否合法
for(int u:eg){
node[u].v=node[u|].v=+min(sum,1000000000ll);
///给每个重构边分配权值
sum-=node[u].v-;
}
return spfa();
}
inline void add(int x,int y,int v){
node[hcnt].to=y;node[hcnt].nxt=head[x];node[hcnt].v=v;head[x]=hcnt++;
}
int main(){
int i,j,group;
mst(head,-);
scanf("%d%d%d%d%d",&n,&m,&L,&S,&T);
for(i=;i<=m;++i){
scanf("%d%d%d",&x,&y,&v);
if(!v)eg.push_back(hcnt);
s[hcnt]=x;
add(x,y,v);
add(y,x,v);
}
LL l=,r=eg.size()*LL(1e9);
if(check()>L||check(r)<L)return *printf("NO\n");
LL ans;
while(l<=r){
LL mid=l+r>>,temp=check(mid);
if(temp>L)ans=mid,r=mid-;
else if(temp<L)l=mid+;
else break;
}
printf("YES\n");
for(i=;i<m*;i+=)printf("%d %d %d\n",s[i],node[i].to,node[i].v);
return ;
}

        

Codeforces Round #372 (Div. 1) B. Complete The Graph的更多相关文章

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

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

  2. Codeforces Round #372 (Div. 2) A .Crazy Computer/B. Complete the Word

    Codeforces Round #372 (Div. 2) 不知不觉自己怎么变的这么水了,几百年前做A.B的水平,现在依旧停留在A.B水平.甚至B题还不会做.难道是带着一种功利性的态度患得患失?总共 ...

  3. Codeforces Round #372 (Div. 2)

    Codeforces Round #372 (Div. 2) C. Plus and Square Root 题意 一个游戏中,有一个数字\(x\),当前游戏等级为\(k\),有两种操作: '+'按钮 ...

  4. 构造图 Codeforces Round #236 (Div. 2) C. Searching for Graph

    题目地址 /* 题意:要你构造一个有2n+p条边的图,使得,每一个含k个结点子图中,最多有2*k+p条边 水得可以啊,每个点向另外的点连通,只要不和自己连,不重边就可以,正好2*n+p就结束:) */ ...

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

  6. Codeforces 716B Complete the Word【模拟】 (Codeforces Round #372 (Div. 2))

    B. Complete the Word time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  7. B. Complete the Word(Codeforces Round #372 (Div. 2)) 尺取大法

    B. Complete the Word time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  8. Codeforces Round #372 (Div. 2) A B C 水 暴力/模拟 构造

    A. Crazy Computer time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  9. Codeforces 715A & 716C Plus and Square Root【数学规律】 (Codeforces Round #372 (Div. 2))

    C. Plus and Square Root time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

随机推荐

  1. XMind--用他来理清自己的思路

    背景 一图胜千言,多年以前阅读了<图谋职场>后,深刻体会了这一点.工作学习,有效利用各种图,事半功倍. 简介 XMIND不仅可以绘制思维导图,还能绘制鱼骨图.二维图.树形图.逻辑图.组织结 ...

  2. Python Kivy 安装问题解决

    Fix: Running this was suggested by @matham in #3889 and solves the problem described below:python -m ...

  3. 我的Android进阶之旅------&gt;Android关于Activity管理的一个简单封装

    怎样管理当前的执行Activity栈,怎样彻底退出程序.本文封装了一个Activity管理类,能够方便随时退出程序. import java.util.Stack; import android.ap ...

  4. C#反射取数组单个元素的类型

    去bing上查了一下,果然有和我一样蛋疼的朋友,他们在论坛研究了半天,最后还是暴力解决: public Type GetArrayElementType(Type t) { string tName ...

  5. 所需即所获:像 IDE 一样使用 vim

    所需即所获:像 IDE 一样使用 vim 转载 yangyangwithgnu@yeah.net2015-11-08 10:05:53 谢谢 捐赠:支付宝 yangyangwithgnu@yeah.n ...

  6. JDK的动态代理机制

    JDK Proxy OverView jdk的动态代理是基于接口的,必须实现了某一个或多个随意接口才干够被代理,并且仅仅有这些接口中的方法会被代理.看了一下jdk带的动态代理api.发现没有样例实在是 ...

  7. 通过 SysVinit、Systemd 和 Upstart 管理系统自启动进程和服务

    管理 Linux 自启动进程 Linux 系统的启动程序包括多个阶段,每个阶段由一个不同的图示块表示.下面的图示简要总结了启动过程以及所有包括的主要组件. Linux 启动过程 当你按下你机器上的电源 ...

  8. maven仓库镜像配置

    <!-- 阿里云仓库 --> <mirror> <id>alimaven</id> <mirrorOf>central</mirror ...

  9. PHP文件包含

    今天突然发现这个东西有好多奇怪的东西,特别写一下记一下 测试用的1.txt及phpinfo.php内容都是phpinfo() 截断: 好多.和好多./截断:这里不测试了,摘自代码审计一书,5.2可用, ...

  10. Django 图片路径问题

    在 django 中不像PHP那样有根目录的概念 而取而代之的是包的概念, 通过URLS.PY 来提供每个URL 对应的DJANGO的 函数来显示页面 在包的 temolates目录中 的html页面 ...