搜索与图论复习1

news/2025/2/4 12:03:35/

1深度优先遍历DFS  2宽度优先遍历BFS  3树与图的存储  4树与图的深度优先遍历  5树与图的宽度优先遍历  6拓扑排序

1DFS:

#include<bits/stdc++.h>
using namespace std;
const int N=10;
int n;
int path[N];
bool st[N];
void dfs(int u){if(n==u){for(int i=0;i<n;i++)cout<<path[i]<<" ";cout<<endl;return ;}for(int i=1;i<=n;i++){if(!st[i]){//第i个没用过 path[u]=i;st[i]=true;dfs(u+1);st[i]=false;}}
}
int main(){cin>>n;dfs(0);return 0;
}

 acwing843

#include<bits/stdc++.h>
using namespace std;
const int N=20;
int n;
char g[N][N];
bool col[N],dg[N],udg[N];//列,左斜,右斜 
void dfs(int u){if(n==u){for(int i=0;i<n;i++)cout<<g[i]<<endl;cout<<endl;return ;}for(int i=0;i<n;i++){if(!col[i]&&!dg[u+i]&&!udg[n-u+i]){g[u][i]='Q';col[i]=dg[u+i]=udg[n-u+i]=true;dfs(u+1);col[i]=dg[u+i]=udg[n-u+i]=false;g[u][i]='.';}}
}
int main(){cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){g[i][j]='.';}}dfs(0);return 0;
}

 第二种代码

#include<bits/stdc++.h>
using namespace std;
const int N=20;
int n;
char g[N][N];
bool row[N],col[N],dg[N],udg[N];//行,列,左斜,右斜 
void dfs(int x,int y,int s){if(y==n)y=0,x++;//第一行越界if(x==n){if(s==n){for(int i=0;i<n;i++)cout<<g[i]<<endl;cout<<endl;}return;}//不放皇后 dfs(x,y+1,s);//放皇后if(!row[x]&&!col[y]&&!dg[x+y]&&!udg[x-y+n]){g[x][y]='Q';row[x]=col[y]=dg[x+y]=udg[x-y+n]=true;dfs(x,y+1,s+1);row[x]=col[y]=dg[x+y]=udg[x-y+n]=false;g[x][y]='.';}
}
int main(){cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){g[i][j]='.';}}dfs(0,0,0);return 0;
}

2BFS:acwing844

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef pair<int,int>PII;
const int N=110;
int n,m;
int g[N][N];
int d[N][N];
PII q[N*N];
int bfs(){int hh=0,tt=0;q[0]={0,0};memset(d,-1,sizeof d);d[0][0]=0;//起点 int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//四方向量 while(hh<=tt){auto t=q[hh++];for(int i=0;i<4;i++){int x=t.first+dx[i],y=t.second+dy[i];if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]==0&&d[x][y]==-1){//在范围内没走过 d[x][y]=d[t.first][t.second]+1;q[++tt]={x,y};}}}return d[n-1][m-1];//右下角的值 
}
int main(){cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>g[i][j];}}cout<<bfs()<<endl;return 0;
}

acwing845八数码

3树和图的存储和遍历:acwing846DFS

#include<iostream>
#include<cstring>
using namespace std;
const int N=100010,M=N*2;
int n,m;
int h[N],e[M],ne[M],idx;
bool st[N];
int ans=N;//最小的最大值 
void add(int a,int b){e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}//以u为根的子树中点的数量
int dfs(int u){st[u]=true;//标记下,已经被搜过了int sum=1,res=0;//当前子树的大小,答案 for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(!st[j]){int s=dfs(j);res=max(res,s);//子树最大值sum+=s;}}res=max(res,n-sum);ans=min(ans,res);return sum; 
} 
int main(){cin>>n;memset(h,-1,sizeof h);for(int i=0;i<n-1;i++){int a,b;cin>>a>>b;add(a,b),add(b,a);}dfs(1);cout<<ans<<endl;return 0;
}

acwing847BFS

#include<iostream>
#include<cstring>
using namespace std;
const int N=100010;
int n,m;
int h[N],e[N],ne[N],idx;
int q[N],d[N];
void add(int a,int b){e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int bfs(){int hh=0,tt=0;q[0]=1;memset(d,-1,sizeof d);d[1]=0;while(hh<=tt){int t=q[hh++];for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(d[j]==-1){d[j]=d[t]+1;q[++tt]=j;}}}return d[n];
}
int main(){cin>>n>>m;memset(h,-1,sizeof h);for(int i=0;i<m;i++){int a,b;cin>>a>>b;add(a,b);}cout<<bfs()<<endl;return 0;
}

4拓扑序列---有向图

#include<iostream>
#include<cstring> 
using namespace std;
const int N=100010;
int n,m;
int h[N],e[N],ne[N],idx;
int q[N],d[N];
void add(int a,int b){e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool toposort(){int hh=0,tt=-1;for(int i=1;i<=n;i++){if(!d[i])q[++tt]=i;}while(hh<=tt){int t=q[hh++];for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];d[j]--;//入度减 if(d[j]==0)q[++tt]=j;//为0就做起点入队 }}return tt==n-1;//说明全部点进了序列,拓扑序列为队列的序 
}
int main(){cin>>n>>m;memset(h,-1,sizeof(h));for(int i=0;i<m;i++){int a,b;cin>>a>>b;add(a,b);d[b]++;//入度 }if(toposort()){for(int i = 0;i < n;i ++)cout<<q[i]<<" ";cout<<endl;}else cout<<"-1"<<endl;return 0;
}


http://www.ppmy.cn/news/1569222.html

相关文章

图论——最小生成树的扩展应用

最小生成树相关原理 acwing1146.新的开始 假设存在一个“超级发电站” 在每一个矿井修发电站相当于从这个“超级发电站”到各个矿井连一条长度为 v [ i ] v[i] v[i]的边。 这样一来这就是一个最短路的模板题。 #include <iostream> #include <cstring> using na…

简易CPU设计入门:指令单元(二)

项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 CSDN文章&#xff1a;下载本项目代码 上述链接为本项目…

理解红黑树

简介&#xff1a;红黑树是一种自平衡二叉查找树&#xff0c;由鲁道夫贝尔&#xff08;Rudolf Bayer&#xff09;在1972年发明&#xff0c;最初称为“对称二叉B树”。它的设计旨在解决普通二叉查找树在频繁插入和删除操作时可能退化为链表的问题&#xff0c;从而保持高效的查找、…

ubuntu18.04环境下,Zotero 中pdf translate划线后不翻译问题解决

问题&#xff1a; 如果使用fastgithub&#xff0c;在/etc/profile中设置全局代理&#xff0c;系统重启后会产生划线后不翻译的问题&#xff0c;包括所有翻译代理均不行。终端中取消fastgithub代理&#xff0c;也不行。 解决&#xff1a; 1&#xff09;不在/etc/profile中设置…

Safari常用快捷键

一、书签边栏 1、显示或隐藏书签边栏&#xff1a;Control-Command-1 2、选择下一个书签或文件夹&#xff1a;向上头键或向下头键 3、打开所选书签&#xff1a;空格键 4、打开所选文件夹&#xff1a;空格键或右箭头键 5、关闭所选文件夹&#xff1a;空格键或左箭头键 6、更…

网络工程师 (13)时间管理

一、定义与重要性 项目时间管理是指为确保项目按时完成而采取的一系列规划、安排和控制活动。它始于项目启动阶段&#xff0c;贯穿整个项目生命周期&#xff0c;直至项目结束。时间管理对于项目的成功至关重要&#xff0c;它有助于项目团队明确工作目标和时间节点&#xff0c;增…

AI生成产品原型与设计稿:我的工具使用心得与推荐

摘要 AI在设计领域的应用日益广泛&#xff0c;尤其在生成产品原型和UI设计稿方面表现突出。本文分享了我常用的AI设计工具及其使用体验&#xff0c;展示了AI生成的设计稿与实际开发页面的对比。此外&#xff0c;还推荐了其他同类工具&#xff0c;并附上官网链接。未来将继续尝试…

为什么LabVIEW适合软硬件结合的项目?

LabVIEW是一种基于图形化编程的开发平台&#xff0c;广泛应用于软硬件结合的项目中。其强大的硬件接口支持、实时数据采集能力、并行处理能力和直观的用户界面&#xff0c;使得它成为工业控制、仪器仪表、自动化测试等领域中软硬件系统集成的理想选择。LabVIEW的设计哲学强调模…