【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 ...
随机推荐
- 杭电1879继续畅通project
继续畅通project Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- JS 滚动条事件
当滚动条滚动到最底部出发事件: $(window).scroll(function(){ if($(document).height()-$(this).scrollTop()-$(this).hei ...
- [转]详细解读TrueSkill 排名系统
概要 大多数竞技游戏都有一个评价玩家是否完成目标的度量指标,它是游戏的基础.对于包含两个或两个以上玩家(多玩家比赛)的比赛,常涉及到游戏玩家技能的排名方法.游戏鼓励玩家之间相互竞争,玩家不只要赢得单场 ...
- 深度学习利器:TensorFlow在智能终端中的应用——智能边缘计算,云端生成模型给移动端下载,然后用该模型进行预测
前言 深度学习在图像处理.语音识别.自然语言处理领域的应用取得了巨大成功,但是它通常在功能强大的服务器端进行运算.如果智能手机通过网络远程连接服务器,也可以利用深度学习技术,但这样可能会很慢,而且只有 ...
- hdoj--3488--Tour(KM)
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Submi ...
- hihoCoder-1830 2018亚洲区预选赛北京赛站网络赛 C.Cheat 模拟
题面 题意:4个人围一圈坐着,每个人13张牌,然后从第一个人开始,必须按照A-K的顺序出牌,一个人出牌后,剩下的人依次可以选择是否质疑他,例如,第一个人现在必须出8(因为按照A-K顺序轮到了),可是他 ...
- Jsoup的简单的使用示例
利用Jsoup中的相关方法实现网页中的数据爬去,本例子爬去的网页为比较流行的programmableweb中的mashup描述内容,然后为数据库中存在的mashup添加相应的描述. package c ...
- QlikSense系列(3)——QlikSense建立数据模型
QlikSense管理数据在帮助中写的比较清楚 https://help.qlik.com/zh-CN/sense/3.1/Subsystems/Hub/Content/LoadData/load-d ...
- TypeScript简单的代码片段
TypeScript中,接口.接口实现.函数重载: interface IThing{ name:string; age:number; sayHello:{ (name:string):string ...
- 使用Flask和Bootstrap构建博客系统(1) - 准备篇
技术栈 macOS10.12.5 Python2.7.13 Bootstrap4.0.0-beta.2 virtualenv virtualenvwrapper 安装Python2.7.13 下载Bo ...