搜索——迭代加深
cdcq学长又再次讲了迭代加深搜索,这个搜索呢是由bfs扩展的方向太多而dfs一条路走到黑很有可能GG,所以采用迭代加深搜索,就是限定一个范围来进行搜索,外形是dfs内部有一个搜索那就是bfs,每次扩展的边再来进行dfs这样的话相对于dfsorbfs答案在很小的地方效率会极高。
一道迭代加深入门题路过,一棵树,找到层数最小的根节点。一个n,n-1行,输入两个数,前一个根节点,后一个父亲节点。
关键就是for(int i=1;;i++)dfs(int x,int y,int z)if(y==z)return;dfs(x,y+1,z);这样是迭代加深的基本通式.
代码:
#include<iostream> #include<iostream> #include<iomanip> #include<cstdio> #include<ctime> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<queue> #include<vector> #include<map> using namespace std; inline 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; } const int maxn=100008; int lin[maxn],ver[maxn],len=0,nex[maxn]; int n; void add(int x,int y) { ver[++len]=y; nex[len]=lin[x]; lin[x]=len; } int dfs(int x,int y,int z) { if(lin[x]==0)return 1; if(y==z){return 0;} for(int i=lin[x];i;i=nex[i]) if(dfs(ver[i],y+1,z)==1)return 1; return 0; } int main() { //freopen("1.in","r",stdin); n=read(); if(n==1) { printf("%d\n",1);return 0;} for(int i=1;i<=n-1;i++) { int x,y; x=read();y=read(); add(y,x); } for(int i=1;;i++) if(dfs(1,1,i)==1){printf("%d\n",i);return 0;} return 0; }
VFK说过一句话
“暴力A了就A了吧……用暴力A掉此题对于写程序的人来说没有任何益处,对我更没坏处。”