【Henu ACM Round#14 F】 President and Roads
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
处理出起点到任意点的最短路以及最短路条数=>dis[0][i],cnt[0][i]
然后
把所有的边反向
处理出在反图上终点到任意点的最短路以及最短路条数=>dis[1][i],cnt[1][i]
dis数组的初值为-1,表示无穷大
设起点到终点的最短路为mini
起点到终点的最短路条数为minicnt
对于每一条边(x,y,z)
如果dis[0][x]==-1 || dis[1][y]==-1代表x或者y不能到达起点或终点
则直接输出NO
否则
如果dis[0][x]+dis[1][y]==mini 且 cnt[0][x]*cnt[1][y]==minicnt的话
输出YES.这条边肯定在最短路上
(这种情况是把重边也考虑进去了的,因为如果有重边那么minicnt肯定不等于cnt[0][x]*cnt[1][y],肯定还要乘上重边的个数的
否则
让z减小到满足dis[0][x]+dis[1][y]+z求最短路条数要用dijkstra算法
用spfa会错
这道题某个点卡1e9+7模数
改成987654321就对了
【代码】
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5;
const ll MOD = 987654321;
int n,m,s,t;
ll cnt[2][N+10];
ll dis[2][N+10];
vector<pair<int,int> > g[2][N+10];
pair<int,pair<int,int> > bian[N+10];
queue<int> dl;
map<pair<int,pair<int,int> >,int>dic;
void get_dis(int s,int k){
for (int i = 1;i <= n;i++) dis[k][i] = -1;
cnt[k][s] = 1;
dis[k][s] = 0;
priority_queue<pair<ll,int> ,vector<pair<ll,int> >,greater<pair<ll,int> > > pq;
pq.push(make_pair(0,s));
while (!pq.empty()){
auto temp1 = pq.top();
pq.pop();
int x = temp1.second;ll dis0 = temp1.first;
if (dis[k][x]!=dis0) continue;
for (auto temp:g[k][x]){
int y = temp.first;ll z = temp.second;
if (dis[k][y]==-1 || dis[k][y]>dis0+z){
dis[k][y] = dis0 + z;
cnt[k][y] = cnt[k][x];
pq.push({dis[k][y],y});
}else if (dis[k][y]==dis0+z) cnt[k][y]=(cnt[k][y]+cnt[k][x])%MOD;
}
}
}
int main()
{
#ifdef LOCAL_DEFINE
freopen("rush.txt","r",stdin);
#endif // LOCAL_DEFINE
ios::sync_with_stdio(0),cin.tie(0);
cin >> n >> m >>s>>t;
for (int i = 1;i <= m;i++){
int x,y,z;
cin >> x >> y >>z;
dic[{x,{y,z}}]++;
bian[i] = {x,{y,z}};
g[0][x].push_back({y,z});
g[1][y].push_back({x,z});
}
get_dis(s,0);
get_dis(t,1);
for (int i = 1;i <= m;i++){
int x,y;
x = bian[i].first;y = bian[i].second.first;
if (dis[0][x]<0 || dis[1][y]<0) {
cout<<"NO"<<endl;
continue;
}
ll z = bian[i].second.second;
if (dis[0][x]+dis[1][y]+z==dis[0][t] && (cnt[0][x]*cnt[1][y]%MOD)==cnt[0][t]){
cout<<"YES"<<endl;
}else{
ll need = dis[0][x]+dis[1][y]+z-dis[0][t]+1;
if ((z-need)>=1){
cout<<"CAN "<<need<<endl;
}else{
cout<<"NO"<<endl;
}
}
}
return 0;
}
【Henu ACM Round#14 F】 President and Roads的更多相关文章
- 【Henu ACM Round#16 F】Om Nom and Necklace
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] KMP算法可以把"i前缀"pre[i] 分成ssssst的形式 这里t是s的前缀. 然后s其实就是pre[i]中 ...
- 【Henu ACM Round#17 F】Upgrading Array
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果我们对某一个位置i操作两次的话. 显然结果就和操作一次一样. 因为第一次操作过后1..i这些数字就变成是互质的了. gcd为1. ...
- 【Henu ACM Round#14 D】Kefa and Dishes
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 状态压缩动规. 可以写成记忆化搜索的形式. f[bit][p] 表示选取的菜的情况为bit(用0..2^(N)-1的二进制形式表示各 ...
- 【Henu ACM Round #13 F】Fibonacci-ish
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举序列的头两个数字是什么 O(N^2) 然后头两个数字确定之后. f[3],f[4]..就确定了 只需查看f[3],f[4]..是 ...
- 【Henu ACM Round#15 F】Arthur and Questions
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] a1+a2+...+ak<a2+a3+...ak+1 ->a1<ak+1 a2+a3+...+ak+1<a3 ...
- 【Henu ACM Round#18 F】Arthur and Walls
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑,为什么一个连通块里面的空格没有变成一个矩形? 如果不是形成矩形的话. 肯定是因为某个2x2的单张方形里面. 只有一个角是墙.其 ...
- 【Henu ACM Round#20 F】 Arthur and Brackets
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 所给的li,ri是左括号从左到右的顺序给的. (且注意长度是2*n 现在我们先把第一个左括号放在第1个位置. 然后考虑第二个位置. ...
- 【Henu ACM Round#19 F】Dispute
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 这一题和这一题很像 (链接 ) 会发现如果a[i]!=b[i]那么就按下i就好了. 然后改变和他相邻的点. 此后a[i]再也不可能和 ...
- 【Henu ACM Round#14 E】Kefa and Watch
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 在做之前需要了解一个知识点. 就是如果一个字符串s是一个a循环串. (字符串的长度设为n,下标从1开始 那么s[1..n-a]和s[ ...
随机推荐
- leetcode 刷题之路 66 Path Sum II
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- HDU 4930 Fighting the Landlords(暴力枚举+模拟)
HDU 4930 Fighting the Landlords 题目链接 题意:就是题中那几种牌型.假设先手能一步走完.或者一步让后手无法管上,就赢 思路:先枚举出两个人全部可能的牌型的最大值.然后再 ...
- [NOI2002] Robot 解题报告(数论+DP)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1408 Description 3030年,Macsy正在火星部署一批机器人. 第1秒,他 ...
- Metasploit的攻击实例讲解----辅助扫描工具
不多说,直接上干货! 怎么弹出来这个呢,连续按两次tab. msf > use auxiliary/scanner/ Display all possibilities? (y or n) us ...
- CUDA笔记(六)
dim3是NVIDIA的CUDA编程中一种自定义的整型向量类型,基于用于指定维度的uint3 忽然发现需要再搞多机MPI的配置,多机GPU集群.好麻烦.. 这两天考完两门了,还剩下三门,并行计算太多了 ...
- Android控件postDelayed用法,View自带的定时器
有一个需求是这样的,点击加关注按钮后,执行关注操作,成功后按钮文字变为“已关注”,保持3秒,三秒后按钮文字便问“取消关注”,点击后执行取消关注的操作 源码: public boolean postDe ...
- 【noip2016】蚯蚓(单调性+队列)
题目贼长 大意是你有n个线段,每一秒你要拿出来最长的一个线段切成两段长度为[p*u](向下取整)和u-[p*u]两段(其中u是线段长,p是一个大于0小于1的实数)没被切的线段长度加q(0<q&l ...
- java 线程传参 方式
第一类:主动向线程传参 public class ThreadTest extends Thread { public ThreadTest() { } /** * 第一种通过构造方法来传递参数 ...
- P2633 Count on a tree(主席树)
题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...
- WHU 1552 Seats 枚举
题意: 有一个年级中7个班的n个学生. 一天,他们毫无顺序的站成一排.请计算最小的交换次数,使得 相同班的同学都站在一起. (只有站在一起的人才能交换) 思路: 如果知道班级的最终排列就能在很短的时间 ...