【题目链接】:http://codeforces.com/problemset/problem/716/D

【题意】



给你一张图;

这张图上有一些边的权值未知;

让你确定这些权值(改成一个正整数)

使得s到t的最短路恰好为L

【题解】



首先;

算出两个值

temp1->所有的未知边的权值都为1->算出s到t的最短路;

temp2->所有的未知边的权值都为INF->算出s到t的最短路;

则必须要有

temp1<=L<=temp2

否则无解;

明白这个之后;

为每一个未知的边都标号;

标号为1..totl;

然后;

二分有多少条未知边的权值边为1;

->mid

找到最小的,使得在mid条未知边的权值为1的时候;

s到t的最短路小于L;

则第mid条边必然在s->t的最短路上;

则把那第mid条边再加上s->t的最短路与L的差值

(前Mid-1条边权值还是1);

(因为1的边越多,s到t的最短路是单调不上升的,所以这么做是可行的)

(又因为是>L和< L的边界,所以那个mid一定是在最短路上的,且没有它最短路就会大于L)



【Number Of WA】



1



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1100;
const int M = 20000+100;
const int INF = 1e9+1; int fir[N],nex[M],en[M],w[M],lable[M];
int totm,totl,n,m,L,s,t;
LL dis[N];
bool exsit[N];
queue <int> dl; void add(int x,int y,int z,int flag)
{
nex[totm] = fir[x];
fir[x] = totm;
en[totm] = y;
w[totm] = z;
if (flag) lable[totm] = totl;
totm++;
} LL spfa(int pre)
{
rep1(i,1,n) dis[i] = -1;
exsit[s] = true;
dl.push(s);
dis[s] = 0;
while (!dl.empty())
{
int x = dl.front();
dl.pop();
exsit[x] = false;
for (int i = fir[x];i>=0;i = nex[i])
{
int y = en[i],cost = w[i];
if (lable[i] && lable[i]<=pre) cost = 1;
if (lable[i] && lable[i]>pre) cost = INF;
if (dis[y]==-1 || dis[y]>dis[x]+cost)
{
dis[y] = dis[x]+cost;
if (!exsit[y])
{
exsit[y] = true;
dl.push(y);
}
}
}
}
return dis[t];
} void out_graph(int key,int sp )
{
rep1(i,1,n)
{
for (int j = fir[i];j >= 0;j = nex[j])
{
if (j&1) continue;
cout <<i-1<<' '<<en[j]-1<<' ';
int cost = w[j];
if (lable[j])
{
if (lable[j]<key) cost = 1;
if (lable[j]==key) cost = sp;
if (lable[j]>key) cost = INF;
}
cout << cost << endl;
}
}
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
ios::sync_with_stdio(false),cin.tie(0);//scanf,puts,printf not use
cin >> n >> m >> L >> s >> t;s++,t++;
rep1(i,1,n) fir[i] = -1;
rep1(i,1,m)
{
int x,y,z;
cin >> x >> y >> z;
x++,y++;
if (z==0) totl++;
add(x,y,z,z==0);
add(y,x,z,z==0);
}
LL temp1 = spfa(totl),temp2 = spfa(0);
if (temp1 <= L && L <= temp2)
{
cout << "YES" << endl;
int l = 0,r = totl,ans;
LL tl,ansl;
while (l <= r)
{
int mid = (l+r)>>1;
tl = spfa(mid);
if (tl<=L)
ans = mid,r = mid-1,ansl = tl;
else
l = mid+1;
}
out_graph(ans,L-ansl+1);
}
else
cout << "NO" << endl;
return 0;
}

【codeforces 716D】Complete The Graph的更多相关文章

  1. 【Codeforces 1009D】Relatively Prime Graph

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 1000以内就有非常多组互质的数了(超过1e5) 所以,直接暴力就行...很快就找完了 (另外一开始头n-1条边找1和2,3...n就好 [代 ...

  2. 【Codeforces 340D】Bubble Sort Graph

    [链接] 我是链接,点我呀:) [题意] 让你根据冒泡排序的规则 建立一张图 问你这张图的最大独立子集的大小 [题解] 考虑a[i]会和哪些点连边? 必然是在a[i]左边且比它大的数字以及在a[i]右 ...

  3. 【Azure Developer】使用Microsoft Graph API 批量创建用户,先后遇见的三个错误及解决办法

    问题描述 在先前的一篇博文中,介绍了如何使用Microsoft Graph API来创建Azure AD用户(博文参考:[Azure Developer]使用Microsoft Graph API 如 ...

  4. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  5. 【codeforces 792D】Paths in a Complete Binary Tree

    [题目链接]:http://codeforces.com/contest/792/problem/D [题意] 给你一棵满二叉树; 给你初始节点; 给你若干个往上走,左走,右走操作; 让你输出一系列操 ...

  6. 【codeforces 755E】PolandBall and White-Red graph

    [题目链接]:http://codeforces.com/contest/755/problem/E [题意] 给你n个节点; 让你在这些点之间接若干条边;构成原图(要求n个节点都联通) 然后分别求出 ...

  7. 【34.57%】【codeforces 557D】Vitaly and Cycle

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  8. 【27.91%】【codeforces 734E】Anton and Tree

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  9. 【30.36%】【codeforces 740D】Alyona and a tree

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

随机推荐

  1. 【函数式】Monads模式初探——Endofunctor

    自函子 自函子(Endofunctor)是一个将范畴映射到自身的函子(A functor that maps a category to itself). 函子是将一个范畴转换到另一个范畴.所以自函子 ...

  2. 先序遍历创建二叉树,对二叉树统计叶子节点个数和统计深度(创建二叉树时#代表空树,序列不能有误)c语言

    #include "stdio.h" #include "string.h" #include "malloc.h" #define NUL ...

  3. Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.2

    Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.2 http://blog.csdn.net/sunbow0 第二章Deep ...

  4. iOS 在 ARC 环境下 dealloc 的使用、理解误区

    iOS 在 ARC 环境下 dealloc 的使用.理解误区 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&qu ...

  5. 项目产品化——Excel数据库模板化导入(java)

    Excel导入可能是代码开发中比較常见的功能,一个项目假设有多个地方须要excel导入数据库.那么开发的工作量也将比較大,项目产品化过程中,将这么一个类似的功能进行封装合并也是必要的.封装好的代码仅仅 ...

  6. 分布式设计《初尝memcached》

          之前听说过高性能的分布式缓存开源工具,但一直没有真正接触过,如今接触的产品中实用到过分布式缓存.所以决定一探到底.memcached是一个优秀的开源的分布式缓存工具.也是眼下比較火热的分布 ...

  7. 134. Gas Station leetcode

    134. Gas Station 不会做. 1. 朴素的想法,就是针对每个位置判断一下,然后返回合法的位置,复杂度O(n^2),显然会超时. 把这道题转化一下吧,求哪些加油站不能走完一圈回到自己,要求 ...

  8. 取消页面按钮的enter按下事件

    <script src="../../@Javascript/jquery-1.8.1.js"></script>       <script lan ...

  9. swi prolog 与c#

    最近,玩了一下prolog语言,感觉还是很有意思.由于我是学c#的,所以就不禁想看看c#如何与prolog进行结合,在网上找了一下,发现有个swi prolog对c#的dll,下载官网:http:// ...

  10. nginx 集群简述

    1.负载均衡介绍: 负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.其工作模式为将外部发送来的请求均匀分配到对称结构中的 ...