题目链接:点击查看

题目大意:给出一个由 n 个点和 m 条边组成的有向图,现在有一个人,他有一条固定的路线,这个题目中有一个导航,当到达任意一个点时,导航都会给出一条通往终点的最短路,但是这个人固定的路线并不一定每次都是最短路,导航最初会给出一条最短路,如果这个人不按照最短路行走的话,那么导航需要“重构”最短路,题目问“重构”的最小次数和最大次数

题目分析:其实读完题后,首先第一反应是先将所有的边置反,然后对于终点求一次迪杰斯特拉,因为这是CF,怕hack,所以尽量还是别用spfa吧,然后题目给出的固定路线中有 k 个点,即 k - 1 条边,对于每条边判断,无非只有三种情况,我们记ans0为最小次数,ans1为最大次数:设这条边为 u -> v

  1. 当前边不是最短路上的边,那么无论如何走,从点 u 到点 v 后,导航一定会重构一次最短路,那么ans0++,ans1++
  2. 当前边是最短路上的边,显然ans0不变,因为选择当前路就可以使得最短路最短,且无需重构
    1. 如果当前边是最短路的必经边,也就是从点 u 到终点只有 u ->v 这一条最短路满足路程最短,ans1不变,因为没有其他选择了
    2. 如果当前边不是最短路的必经边,那么必然存在另一条边 u -> t 满足点 u 到终点的距离仍然是最短路,此时选择 u -> t 这条路可以使ans1++

然后直接模拟上述三种情况就好了,为了方便书写,迪杰斯特拉我用了链式前向星的模板,建立反向边,而正向边仍然用邻接表储存,用于最后统计答案时用

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;//顶点数 const int M=2e5+100;//边数struct Edge
{int to,w,next;
}edge[M];int head[N],d[N],cnt;//链式前向星 bool vis[N];void addedge(int u,int v,int w)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;
}struct Node
{int to,w;Node(int TO,int W){to=TO;w=W;}bool operator<(const Node& a)const{return w>a.w;}
};void Dijkstra(int st)
{priority_queue<Node>q;memset(vis,false,sizeof(vis));memset(d,inf,sizeof(d));d[st]=0;q.push(Node(st,0));while(q.size()){Node cur=q.top();int u=cur.to;q.pop();if(vis[u])continue;vis[u]=true;for(int i=head[u];i!=-1;i=edge[i].next)//扫描出所有边 {int v=edge[i].to;int w=edge[i].w;if(d[v]>d[u]+w)//更新 {d[v]=d[u]+w;q.push(Node(v,d[v]));}}}
}void init()
{memset(head,-1,sizeof(head));cnt=0;
}vector<int>node[N];int a[N];int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);init();int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);node[u].push_back(v);addedge(v,u,1);}int k;scanf("%d",&k);for(int i=1;i<=k;i++)scanf("%d",a+i);Dijkstra(a[k]);int ans_0=0,ans_1=0;int u=a[1];int dis=d[u];for(int i=2;i<=k;i++){int v=a[i];if(d[u]!=d[v]+1)//新加的边不在最短路上{ans_1++,ans_0++;}else//在最短路上{for(auto vv:node[u]){if(vv==v)continue;if(d[u]==d[vv]+1){ans_1++;break;}}}u=v;}printf("%d %d\n",ans_0,ans_1);}

CodeForces - 1321D Navigation S.ystem(最短路+思维)相关推荐

  1. CodeForces - 1307D Cow and Fields(最短路+思维)

    题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的无向图,其中有 k 个点被标记了,题目要求选出两个被标记的点,连接一条边,使得从点 1 到点 n 的最短路最大 题目分析:读完题后, ...

  2. CodeForces - 1529F It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!(最短路+思维建图)

    题目链接:点击查看 题目大意:给出 nnn 个点(从 000 开始编号)和 mmm 条边的有向带权图,不过 mmm 条边是动态的,经过 ttt 秒后,第 iii 条边就从 ai−>bi,cia_ ...

  3. CodeForces - 475B Strongly Connected City(最短路+判断强联通图/思维)

    题目链接:点击查看 题目大意:给出n和m然后给出n条横向街道和m条纵向街道,总共包括了n*m个结点,每条街道都是单向通道,问该图是否能够组成强联通图(有向图中任意两点间都存在路径) 题目分析:乍一看没 ...

  4. Codeforces Round #703 (Div. 2) E. Paired Payment 最短路 + 思维

    link 题意: 给一张图,每次只能一下走两个点,比如当前在aaa,往下走到bbb再到ccc,权值为(wa,b+wb,c)2(w_{a,b}+w_{b,c})^2(wa,b​+wb,c​)2.求1到其 ...

  5. CodeForces - 1196F K-th Path(最短路+思维)好题

    题目链接:点击查看 题目大意:给出一个 n 个点,m 条边的无向图,需要求出图中第 k 短的路径 题目分析:k 是 400,本来以为是需要思考 k * n 或 k * m 的算法,搞了半天最后原来是 ...

  6. CodeForces - 1422D Returning Home(最短路+思维建图)

    题目链接:点击查看 题目大意:给出一个 n * n 的二维平面,现在要从点 ( sx , sy ) 到达点 ( fx , fy ),在平面上有 m 个传送门,共有两次操作: 向上.下.左.右移动一个单 ...

  7. CodeForces - 1422D(建图+最短路)

    CodeForces - 1422D 题意: 二维平面给一个起点和一个终点,给m个传送门,开始位于起点,每次可以走上下左右四个方向,花费为1,当位于和给的传送门有相同的x或者y,可以直接传送到传送门, ...

  8. Codeforces.1051F.The Shortest Statement(最短路Dijkstra)

    题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚 ...

  9. codeforces 808 E. Selling Souvenirs (dp+二分+思维)

    题目链接:http://codeforces.com/contest/808/problem/E 题意:最多有100000个物品最大能放下300000的背包,每个物品都有权值和重量,为能够带的最大权值 ...

最新文章

  1. X-UA-Compatible也无法解决的IE11兼容问题
  2. 测试功能范围_IT8511+电子负载 OCP?测试功能
  3. “金融与安全大数据”专题导读
  4. python学习笔记(对象)
  5. docker 厂商 容器_我终于不用再解释Docker了!
  6. 华为模拟器eNSP安装教程
  7. VMware中进行文件移动/复制权限不够的问题
  8. 网站资源:分享7个实用好玩的在线网站,值得收藏!
  9. GPS 入门 6 —— 各国卫星导航系统比较(北斗、伽利略、GLONASS、GPS)(转)
  10. 基于反射实现的一个观察者模板
  11. 建立一个网站的具体过程
  12. oracle 登录失败次数,Oracle用户连续登录失败次数限制如何取消
  13. 提供聚合物水凝胶的用途和结构式(供应胶原-聚乙烯醇(PVA)复合/P(DMAA-co-MMA)/Nano-SiO2复合水凝胶/聚乙烯醇PVA基复合水凝胶/纤维素/聚谷氨酸(BC/PGA)复合水凝胶)
  14. 无人驾驶汽车系统入门(二十三)——迁移学习和端到端无人驾驶
  15. 解决Python3 urllib3 urllib3.exceptions.maxretryerror: httpsconnectionpool(host=‘xxxxx‘, port=443)
  16. 梦幻岛:一场“艺术策展”与“WEB3”的梦幻联动
  17. R语言使用lm函数构建分层线性回归模型(添加分组变量构建分层线性回归模型)、使用coef函数提取分层线性回归模型的系数及截距、计算第一个分组的间距和斜率信息(第一个分组,对照组)
  18. Matlab kaiser窗 C++实现
  19. VOIP通信中Codec选择的几个时代。
  20. 小米小贷业务生变,消费贷业务并入小米消金

热门文章

  1. 有多个重载参数pow_随时随地想充就充,同时最多能给三部手机充电的南卡无线充电宝POW-1体验...
  2. mysql 运行模式_MySQL的运行模式及一些特性,引擎、事务、并发控制、优化总结...
  3. Kotlin 和Spring WebFlux
  4. AbstractBeanFactory 生产Bean 实例对象
  5. Elastic-Job发展历史
  6. @EnableAutoConfiguration注解的实现原理
  7. Hive的安装-Hive配置
  8. redis(9)--数据库
  9. 八月25日8点半服务器维修,三国乱世8月25日合区维护公告
  10. linux中wget命令出现错误,(转)linux中wget未找到命令