【codeforces 716D】Complete The Graph
【题目链接】: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的更多相关文章
- 【Codeforces 1009D】Relatively Prime Graph
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 1000以内就有非常多组互质的数了(超过1e5) 所以,直接暴力就行...很快就找完了 (另外一开始头n-1条边找1和2,3...n就好 [代 ...
- 【Codeforces 340D】Bubble Sort Graph
[链接] 我是链接,点我呀:) [题意] 让你根据冒泡排序的规则 建立一张图 问你这张图的最大独立子集的大小 [题解] 考虑a[i]会和哪些点连边? 必然是在a[i]左边且比它大的数字以及在a[i]右 ...
- 【Azure Developer】使用Microsoft Graph API 批量创建用户,先后遇见的三个错误及解决办法
问题描述 在先前的一篇博文中,介绍了如何使用Microsoft Graph API来创建Azure AD用户(博文参考:[Azure Developer]使用Microsoft Graph API 如 ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- 【codeforces 792D】Paths in a Complete Binary Tree
[题目链接]:http://codeforces.com/contest/792/problem/D [题意] 给你一棵满二叉树; 给你初始节点; 给你若干个往上走,左走,右走操作; 让你输出一系列操 ...
- 【codeforces 755E】PolandBall and White-Red graph
[题目链接]:http://codeforces.com/contest/755/problem/E [题意] 给你n个节点; 让你在这些点之间接若干条边;构成原图(要求n个节点都联通) 然后分别求出 ...
- 【34.57%】【codeforces 557D】Vitaly and Cycle
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【27.91%】【codeforces 734E】Anton and Tree
time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【30.36%】【codeforces 740D】Alyona and a tree
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
随机推荐
- HDU 5218 The E-pang Palace (简单几何—2014广州现场赛)
题目链接:pid=5128">http://acm.hdu.edu.cn/showproblem.php? pid=5128 题面: The E-pang Palace Time Li ...
- 国外物联网平台初探(四):Ayla Networks
定位 Ayla企业软件解决方案为全球部署互联产品提供强大的工具 功能 Ayla的IoT平台包含3个主要组成部分: (1) Ayla嵌入式代理Ayla Embedded Agents (2) Ayla云 ...
- JavaScript:目录
ylbtech-JavaScript:目录 1. https://www.javascript.com/ 2. 1.返回顶部 1. http://www.runoob.com/js/js-functi ...
- Serializable-源码分析
package java.io; public interface Serializable { } 代码很简单,功能也很简单,对象通过这个接口来实现序列化和反序列的.下面来看看小例子. import ...
- Python迭代与递归方法实现斐波拉契数列
首先是迭代的方法实现: def f(n): f1, f2, fn = 1, 1, 1 while n>2: fn = f1 + f2 f1 = f2 f2 = fn n = n - 1 retu ...
- 2015 多校赛 第一场 1002 (hdu 5289)
Description Tom owns a company and he is the boss. There are n staffs which are numbered from 1 to n ...
- 第5章分布式系统模式 Broker(代理程序)
许多复杂的软件系统运行在多个处理器或分布式计算机上.将软件分布在多台计算机上的原因有多种,例如: 分布式系统可以利用多个 CPU 或一群低成本计算机的计算能力. 某个软件可能仅在特定计算机上可用. 出 ...
- React+webpack
webPack + React 步骤: 1. 创建文件夹 src 源代码目录 main.js 打包的入口文件 App.js 项目的根组件 import React,{Component} from ' ...
- 问题集锦 ~ CSS
#button标签点击后出现点边框 input {outline: none;} button::-moz-focus-inner {border: none;}
- Vue的前端路由
vue-router-- 根据不同的地址找到不同的页面 (单页面应用:无需频繁的从后台刷新页面) 1,安装路由-->导 ...