Codeforces 715B


学号:16340050
数据科学与计算机学院(http://sdcs.sysu.edu.cn/)


目录

  • Codeforces 715B

    • 原题链接
    • 题目大意
    • 思路分析
    • 实现代码

原题链接


http://codeforces.com/problemset/problem/715/B

题目大意

ZS画了一幅有n条边m个点的带权无向图,但是有一些边的权值被擦去了,ZS想知道,是否存在一种方案,将所有被擦去的边的权值重新赋值一个正整数,使得从u到v的最短路恰好为L。如果有,则输出Yes和修改方案。如果无,则输出No

思路分析

我们不妨先将无权值的边视为断边,求出u到能到达的点i的最短路1dis(u,i)。然后求v到j的最短路dis(v,j),其中,当遇到无权值的边时令权值

cost[i,j]=max(1,L−dis[u,i]−dis[v,j])

cost[i,j]=max(1,L-dis[u,i]-dis[v,j])
如果存在合法的方案,那么这种赋值方式保证我们可以得到其中一种合法的修改方案。如果不存在合法的方案,那么这种赋值方法则保证我们将所有的可修改边都赋值成了1
最后判断一下dis(u,v)是否等于L即可得出答案

实现代码

C++
#include<cstdio>
#include<queue>
#include<utility>
#include<cstring>
#include<algorithm>
#define MAXM 50100
#define MAXN 1100using namespace std;int n,m,L,s,t,num,tot;
int g[MAXN],next[MAXM],cost[MAXM],y[MAXM];
int dis[MAXN],f[MAXN];
bool vis[MAXN];struct rec{int u,v,z;
}edge[MAXM];void Insert(int u,int v,int z){y[++tot]=v;next[tot]=g[u];g[u]=tot;cost[tot]=z;
}int Scan(){int u,v,z;scanf("%d%d%d%d%d",&n,&m,&L,&s,&t);tot=1;for (int i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&z);edge[++num].u=u;edge[num].v=v;edge[num].z=z;Insert(u,v,z); Insert(v,u,z);}
}struct cmp{bool operator ()(pair<int,int> a,pair<int,int> b){return a.second>b.second;}
};void Dijkstra(int st,int*d,int*anti,bool flag){priority_queue<pair<int,int>,vector<pair<int,int> >,cmp> q;memset(vis,0,sizeof(vis));d[st]=0;q.push(make_pair<int,int>(st,d[st]));while (!q.empty()){pair<int,int>sa=q.top(); q.pop();int now=sa.first;int used=sa.second;if (vis[now]) continue;vis[now]=true;for (int e=g[now];e!=0;e=next[e]){int son=y[e];if (cost[e]==0&&flag==0) continue;if (cost[e]==0&&flag==1) {cost[e]=cost[e^1]=max(1,L-used-anti[son]);edge[e/2].z=edge[(e^1)/2].z=cost[e];}if (d[son]>used+cost[e]) {d[son]=used+cost[e];q.push(make_pair<int,int>(son,d[son]));}}}
}void Work(){memset(dis,60,sizeof(dis));memset(f,60,sizeof(f));Dijkstra(t,f,dis,false);Dijkstra(s,dis,f,true);
}void Print(){if (dis[t]==L){printf("YES\n");for (int i=1;i<=m;i++) printf("%d %d %d\n",edge[i].u,edge[i].v,max(1,edge[i].z));} else printf("NO\n");
}int main(){Scan();Work();Print();
}

  1. 在本文代码中,求最短路径使用优先队列优化Dijkstra https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm ↩

Codeforces 715B相关推荐

  1. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  2. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  3. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

  4. CodeForces 获得数据

    针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...

  5. codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...

    题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...

  6. CodeForces 595A

    题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...

  7. codeforces A. Jeff and Digits 解题报告

    题目链接:http://codeforces.com/problemset/problem/352/A 题目意思:给定一个只有0或5组成的序列,你要重新编排这个序列(当然你可以不取尽这些数字),使得这 ...

  8. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  9. Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)

    Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...

最新文章

  1. Qt 多线程TCP服务端一键关闭所有客户端
  2. Spring-BeanFactory源码分析
  3. 安卓加载asset中的json文件_Android解析Asset目录下的json文件
  4. 子集和与一个整数相等算法_背包问题的一个变体:如何解决Java中的分区相等子集和问题...
  5. 14-mysql-分页查询
  6. java指定jre_java 运行应用程序,指定jre版本
  7. JLU数据结构第六次上机实验解题报告
  8. 人工神经网络可以做什么,人工神经网络有什么用
  9. 工具类APP如何做ASO优化推广
  10. 电脑怎么设置微信定位服务器,电脑版微信,一个很简单的客户端,许多功能不支持...
  11. Unity Predefined assemblies/assembly definition files
  12. 进程和线程的区别是什么呢?
  13. 国内可以为程序员提供兼职的平台有哪些?
  14. 福成股份很忙:实控人李福成被罚8万,新董事长李良则要打官司
  15. matlab提取图形形心
  16. 如何查看浏览器已经记录的密码
  17. 哪一刻你才发现青春结束了
  18. 统计一个英文文本字符串中包含的英文原因字母的个数。
  19. 蓝牙模块HC08 和 手机APP数据传输 (STM32代码)
  20. 如何使用eeglab画出理想的脑电图

热门文章

  1. Android 访问系统相册选中图片,并返回该图片的路径
  2. c++整人代码,超级加倍,让人承认我是大傻猪
  3. GIT切换分支的简单操作
  4. 查询是否有公网IP的方法
  5. 软件工程大作业(完整详细)火车订票管理系统
  6. children()和children以及childrenNode的区别
  7. Tiny 4412 lcd 驱动分析
  8. 深度学习-第二章 卷积神经网络面试题(大厂必问,历经半年整理)
  9. Elasticsearch应用场景(三)
  10. okio 原理分析(一)