2.22总结

news/2025/2/23 17:43:31/文章来源:https://www.cnblogs.com/OIer-QAQ/p/18732525

P5318 【深基18.例3】查找文献

考查图上深搜与图上广搜
深搜:
采用邻接表存图
如果u->v有一条边,那么在遍历了u之后遍历v;
同时每个点只能走一次,所以使用vis进行标记,没有被标记过才能继续递归

void dfs(int x){cout<<x<<' ';for(int v:vt[x]){if(vis[v]==0){vis[v]=1;dfs(v);}}
}

广搜:
同理,只是将递归改为入队即可

void bfs(int x){queue<int>q;q.push(x);while(!q.empty()){int x=q.front();q.pop();if(vis[x]==1){continue;}vis[x]=1;cout<<x<<' ';for(int v:vt[x]){q.push(v);}}
}

合并起来:

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5,mod=1e9+7,inf=1e18;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0' && ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
void write(int x){if(x<0){putchar('-'),x=-x;}if(x>9){write(x/10);}putchar(x%10+'0');return;}
int fpow(int a,int b,int p){if(b==0){return 1;}int res=fpow(a,b/2,p)%p;if(b%2==1){return((res*res)%p*a)%p;}else{return(res*res)%p;}}
int n,m;
vector<int>vt[maxn];
bool vis[maxn];
void dfs(int x){vis[x]=1;cout<<x<<' ';for(int v:vt[x]){if(vis[v]==0){dfs(v);}}
}
void bfs(int x){queue<int>q;q.push(x);while(!q.empty()){int x=q.front();q.pop();if(vis[x]==1){continue;}vis[x]=1;cout<<x<<' ';for(int v:vt[x]){q.push(v);}}
}
signed main(){cin>>n>>m;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;vt[u].push_back(v);}for(int i=1;i<=n;i++){sort(vt[i].begin(),vt[i].end());}dfs(1);cout<<endl;memset(vis,0,sizeof(vis));bfs(1);return 0;
}

P3916 图的遍历

朴素做法:
对于每个点,跑一遍深搜,不断更新最大值
时间复杂度\(O(n^2\log n )\)
优化做法:
考虑逆思维,可以从每个最大的点去找能到达的点,反向建图,细节见代码

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5,mod=1e9+7,inf=1e18;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0' && ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
void write(int x){if(x<0){putchar('-'),x=-x;}if(x>9){write(x/10);}putchar(x%10+'0');return;}
int fpow(int a,int b,int p){if(b==0){return 1;}int res=fpow(a,b/2,p)%p;if(b%2==1){return((res*res)%p*a)%p;}else{return(res*res)%p;}}
int n,m;
vector<int>vt[maxn];
bool vis[maxn];
int ans[maxn];
void dfs(int x,int root){	vis[x]=1;if(ans[x]!=-1){return;}ans[x]=root;for(int v:vt[x]){if(vis[v]==0){dfs(v,root);}}
}
signed main(){cin>>n>>m;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;vt[v].push_back(u);//反向建图}memset(ans,-1,sizeof(ans));for(int i=n;i>=1;i--){//从最大的开始dfs(i,i);//遍历可到达的点}for(int i=1;i<=n;i++){cout<<ans[i]<<' ';}return 0;
}
时间复杂度$O(n\log n)$

P2853 [USACO06DEC] Cow Picnic S

使用一个桶记录每个点能被多少头奶牛经过,如果数量为k则答案加一

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5,mod=1e9+7,inf=1e18;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0' && ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
void write(int x){if(x<0){putchar('-'),x=-x;}if(x>9){write(x/10);}putchar(x%10+'0');return;}
int fpow(int a,int b,int p){if(b==0){return 1;}int res=fpow(a,b/2,p)%p;if(b%2==1){return((res*res)%p*a)%p;}else{return(res*res)%p;}}
int n,m,k;
vector<int>vt[maxn];
bool vis[maxn];
int cow[maxn],sz[maxn];
void dfs(int x){sz[x]++;vis[x]=1;for(int v:vt[x]){if(vis[v]==0){dfs(v);}}
}
signed main(){cin>>k>>n>>m;for(int i=1;i<=k;i++){cin>>cow[i];}for(int i=1;i<=m;i++){int u,v;cin>>u>>v;vt[u].push_back(v);}for(int i=1;i<=n;i++){//每一头奶牛dfs(cow[i]);//dfs搜索+标记memset(vis,0,sizeof(vis));//清空}int sum=0;for(int i=1;i<=n;i++){if(sz[i]==k){sum++;}}cout<<sum;return 0;
}

P7370 [COCI 2018/2019 #4] Wand

建反图
如果B打败了A,那么魔杖从B到A
如果从1开始,能到达i,则因为可以随意调整顺序,所以i一定可以拿到魔杖
同时从1开始,不要标记1,因为如果不存在一个包含1的环,则1不能拿到魔杖
特殊情况:没有人能打败1,即vt[1]==0,此时魔杖一定在1手上

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5,mod=1e9+7,inf=1e18;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0' && ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
void write(int x){if(x<0){putchar('-'),x=-x;}if(x>9){write(x/10);}putchar(x%10+'0');return;}
int fpow(int a,int b,int p){if(b==0){return 1;}int res=fpow(a,b/2,p)%p;if(b%2==1){return((res*res)%p*a)%p;}else{return(res*res)%p;}}
int n,m;
vector<int>vt[maxn];
bool vis[maxn];
int ans[maxn];
void dfs(int x){	for(int v:vt[x]){if(vis[v]==0){vis[v]=1;dfs(v);}}
}
signed main(){cin>>n>>m;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;vt[v].push_back(u);}dfs(1);if(vt[1].size()==0){vis[1]=1;}for(int i=1;i<=n;i++){cout<<vis[i];}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/888492.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot中如何优雅地读取Jar包中的Resources目录下的文件

在Java的Spring Boot项目中,我们经常需要从resources目录下读取配置文件或其他资源文件。在本地开发环境中,我们可以轻松地使用绝对路径访问这些文件,但项目一旦打包成Jar包并部署到服务器上,这种访问方式就失效了。 因此,掌握在Jar包中读取resources目录下文件的方法至关…

开学测试总结owo

经过这次的小测,在这次测试中,我个人认为最大的变化,就是逻辑性增强,sql语句的要求更多了, 这就反应了对于web应用开发这门课对我们专业的用处,还有,前端页面的美化,我认为前端代码,多 数交给AI就可以了,但主要是你自己要明白需求到底是什么,你要完成的项目是什么,…

get current user

02 - 从SpringSecurity中获取当前用户 一行搞定 SecurityContextHolder.getContext().getAuthentication().getPrincipal();这里自定义了一个UserDetailsImpl类实现UserDetails接口, 此时loadUserByUsername方法的返回对象的类型也要改成自定义类型(01篇最后那样), 不然报错。测…

自编译Frp 实现二次开发

在使用过程中,我们都是利用作者打包好的包,直接使用。但是现实中,我们可能需要对其进行二开。 因而,本文简单的为大家介绍下frp的二次开发。以修改frps dashboard为例。现在让我们一起来学习吧。修改之前的界面修改后效果 安装GO环境 因为,Frp是基于GO开发的,所以我们需要…

从黑盒到透明:AI Agent 运行监控实战!

你是否遇到过这样的情况:辛辛苦苦开发的 AI Agent 突然失灵了,却不知道是哪个环节出了问题?今天给家人们分享一下如何让 AI Agent 的运行过程透明化。 一、为什么要监控 AI Agent? 传统的对话系统就像一张预先画好的地图,用户只能按照既定路线前进。而 AI Agent 则像是一位…

[2025.2.23] 周记

引言在这周的面试当中,我遇到了几个不是很清楚的题目,回家之后进行学习发现了一些比较有意思的事情,在这里记录一下 这周还发现了一个很有帮助的Java知识网站:Java 基础 - 面向对象 | Java 全栈知识体系1.字符串和常量池 在这次面试当中遇到的一个原题就是 String i = "i&…

YOLOv5 的量化及部署 - RGB 专题

技术背景 YOLOv5 是一种高效的目标检测算法,尤其在实时目标检测任务中表现突出。YOLOv5 通过三种不同尺度的检测头分别处理大、中、小物体;检测头共包括三个关键任务:边界框回归、类别预测、置信度预测;每个检测头都会逐像素地使用三个 Anchor,以帮助算法更准确地预测物体…

Java基础学习(十七)

Java基础学习(十七):网络编程 目录Java基础学习(十七):网络编程概念IP端口号协议UDP 通信TCP 通信 本文为个人学习记录,内容学习自 黑马程序员概念定义:在网络通信协议下,不同计算机上运行的程序进行的数据传输 常见的软件架构:C/S 和 B/SC/S:Client/Server,在用户…

最小费用最大流问题的 SSP 算法

我们已经了解最大流问题,其目标是通过网络中的各条边传输流量,尽可能地从源点流向汇点。通过经典的算法,如 Ford-Fulkerson 增广,我们能够找到一种方式,最大化从源点到汇点的流量。 然而,最大流问题的基本形式并没有考虑流动的成本。一个图的最大流值是一个固定数,可以由…

逆向软件设计-扫雷(C语言)

本人选用了舍友开发的C语言扫雷游戏用以学习逆向软件设计,环境为vs2022 在该程序中,代码被分成了三个部分,分别是game的头文件和源文件,以及test的源文件 在game的头文件中,代码主要包括了游戏的基本信息和函数 #include<stdio.h> #include<stdlib.h> #includ…

将一个数组旋转 k 步

题目:将一个数组旋转 k步。如输入一个数组[1,2,3,4,5,6,7] 和 k = 3, 即旋转 3步。输出 [5,6,7,1,2,3,4] 解题思路:思路1: 把k 后面的元素,挨个pop,然后unshif 到数组前面 思路2: 将 k 后面的所有数据拿出来作为 part1 将 k前面的所有数据拿出来作为part2 返回 part1.conca…

bge-large-zh-v1.5 和 bge-reranker-large模型有什么区别和联系

BGE(BAAI General Embedding)系列模型是智源研究院开发的高性能语义表征工具,其中bge-large-zh-v1.5和bge-reranker-large是两类不同功能的模型。它们的区别和联系如下:核心区别功能定位bge-large-zh-v1.5:属于Embedding模型,主要用于将文本(如句子或段落)转换为高维向…