博客园体验更佳

讲讲我的做法

确定做法

首先,看到这道题,我直接想到的是递归,于是复杂度就上天了,考虑最短路

如何用最短路

首先,看一张图

我们该如何解决问题?

问题:\(3\)做\(5\)阶段的零件\(1\)要不要做呢?

其实,实质就是看\(3\)到\(1\)有没有长度为\(5\)的路径。

问题:\(3\)做\(7\)阶段的零件\(1\)要不要做呢?

其实,实质就是看\(3\)到\(1\)有没有长度为\(7\)的路径。

问题:\(3\)做\(6\)阶段的零件\(1\)要不要做呢?

其实,实质就是看\(3\)到\(1\)有没有长度为\(6\)的路径。

仔细思考这\(3\)个问题,我们会发现,如果\(3\)到\(1\)有长度为\(5\)的路径,那么\(3\)到\(1\)一定有长度为\(7\)的路径,但并不一定有长度为\(6\)的路径。

所以,我们要对每个点求一遍奇数路径,和偶数路径。

实现最短路

最短路的算法有很多,这道题最好用\(dijkstra\),或\(bfs\)。

这道题的时限并不紧,并且\(dijkstra\)细节太多,我就来演示\(bfs\)实现的最短路

void bfw(){//我有一个好朋友叫bfw,所以我写bfs时,喜欢把函数名起为bfw
memset(ji,0x3f,sizeof(ji));//奇数最短路径
memset(ou,0x3f,sizeof(ou));//偶数最短路径
queue<pair<int,int> >q;
q.push(make_pair(1,0));
ou[1]=0;
while(q.size()){
int x=q.front().first,y=q.front().second;
for(int i=0;i<v[x].size();i++){
if(y%2==1){//奇数+1=偶数
if(y+1<ou[v[x][i]]){
ou[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}else{//偶数+1=奇数
if(y+1<ji[v[x][i]]){
ji[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}
}
q.pop();
}
}

\(v\)数组是一个动态数组,也就是\(vector\),曹老师教我们多用\(STL\)写程序

如果你写这样的\(bfs\)民间数据会\(WA\) \(1\)个点 ,这个点是这样的

\(1\)号点是一个孤点,没有偶数路径,所以,我们的\(bfs\)要这么写

void bfw(){//我有一个好朋友叫bfw,所以我写bfs时,喜欢把函数名起为bfw
memset(ji,0x3f,sizeof(ji));//奇数最短路径
memset(ou,0x3f,sizeof(ou));//偶数最短路径
queue<pair<int,int> >q;
for(int i=0;i<v[1].size();i++){
ji[v[1][i]]=1;
q.push(make_pair(v[1][i],1));
}
while(q.size()){
int x=q.front().first,y=q.front().second;
for(int i=0;i<v[x].size();i++){
if(y%2==1){//奇数+1=偶数
if(y+1<ou[v[x][i]]){
ou[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}else{//偶数+1=奇数
if(y+1<ji[v[x][i]]){
ji[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}
}
q.pop();
}
}

简要讲解主程序

有了这些主程序应该是很简单的了

int main(){
int n,m,q;
read(n);read(m);read(q);
for(int i=1;i<=m;i++){
int x,y;
read(x);read(y);//无向边
v[x].push_back(y);//连边
v[y].push_back(x);//连边
}
bfw();//跑最短路
while(q--){
int x,y;
read(x);read(y);
if(y%2==0){
if(ou[x]>y)puts("No");//如果大于就不可能了
else puts("Yes");
}else{
if(ji[x]>y)puts("No");//如果大于就不可能了
else puts("Yes");
}
}
return 0;
}

总结

先来看一看这题完整的代码了

#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(T &FF){
T RR=1;FF=0;char CH=getchar();
for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
FF*=RR;
}
template<typename T>void write(T x){
if(x<0)putchar('-'),x*=-1;
if(x>9)write(x/10);
putchar(x%10+48);
}
vector<int>v[100010];
int ji[100010],ou[100010];
void bfw(){//我有一个好朋友叫bfw,所以我写bfs时,喜欢把函数名起为bfw
memset(ji,0x3f,sizeof(ji));//奇数最短路径
memset(ou,0x3f,sizeof(ou));//偶数最短路径
queue<pair<int,int> >q;
for(int i=0;i<v[1].size();i++){
ji[v[1][i]]=1;
q.push(make_pair(v[1][i],1));
}
while(q.size()){
int x=q.front().first,y=q.front().second;
for(int i=0;i<v[x].size();i++){
if(y%2==1){//奇数+1=偶数
if(y+1<ou[v[x][i]]){
ou[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}else{//偶数+1=奇数
if(y+1<ji[v[x][i]]){
ji[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}
}
q.pop();
}
}
int main(){
int n,m,q;
read(n);read(m);read(q);
for(int i=1;i<=m;i++){
int x,y;
read(x);read(y);//无向边
v[x].push_back(y);//连边
v[y].push_back(x);//连边
}
bfw();//跑最短路
while(q--){
int x,y;
read(x);read(y);
if(y%2==0){
if(ou[x]>y)puts("No");//如果大于就不可能了
else puts("Yes");
}else{
if(ji[x]>y)puts("No");//如果大于就不可能了
else puts("Yes");
}
}
return 0;
}

这道题还是比较有思维含量的,民间数据也出的很好,让我们思考全面。

最后,还是希望大家不懂就在评论区问,觉得好就点赞!

最新文章

  1. XML 序列化与反序列化
  2. 多线程下OpenCV操作的问题
  3. 用pip爽久了,竟然完了easy install安装过程了
  4. SQL2008-截取字段函数
  5. 关于Python中的设计模式
  6. CAS单点登录配置[3]:服务器端配置
  7. Setup VSFTPD Server with Virtual Users On CentOS, RHEL, Scientific Linux 6.5/6.4/6.3
  8. 用于Lucene的各中文分词比较
  9. 走进C++程序世界-----函数相关(全局变量)
  10. python的学习笔记01_4基础数据类型列表 元组 字典 集合 其他其他(for,enumerate,range)
  11. 主流图库对比以及JanusGraph入门
  12. mouseover和mouseenter,mouseout和mouseleave的区别-引发的探索
  13. .NET Core 中正确使用 HttpClient 的姿势
  14. Keras 中 TimeDistributed 和 TimeDistributedDense 理解
  15. 使用正则真正的修改TP5的config.php文件
  16. SQL-15 查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列
  17. ES6核心内容讲解
  18. iOS 中JSONModel的使用
  19. 处理EXCEL11问题
  20. 监控控制台是否运行的bat

热门文章

  1. golang xml解析
  2. Dream权限追踪系统&lt;=2.0.1 重安装漏洞
  3. PHP manual-mysqli-connections-翻译
  4. C++走向远洋——38(用对象数组操作长方柱类)
  5. 一步到位datatabls中文化
  6. 聊一聊MyBatis 和 SQL 注入间的恩恩怨怨
  7. Day 3 DP
  8. NetAnalyzer笔记 之 十一 打造自己的协议分析语言(1)初衷与语法构想
  9. 峰哥说技术:08-Spring Boot整合FreeMarker视图
  10. Windows下安装虚拟机