图的dfs、bfs

来源:互联网 发布:养匪自重知乎 编辑:程序博客网 时间:2024/05/17 22:53

题目:http://www.gdfzoj.com/oj/contest/150/problems/7

这种搜环类型的题就是dfs。不多说,上代码

#include <cstdio>#include <vector>#include <cstring>using namespace std;const int maxSize=2000;int n,m,num=1,t;int a[maxSize+5][maxSize+5];bool ans;int vis[maxSize+5];vector <int> M[maxSize+5];void dfs(int x){int i,y,j,t1;if (x==t)//搜回去{ans=true;return ;}vis[x]=true;for (i=0;i<M[x].size();i++)if (!vis[M[x][i]])dfs(M[x][i]);}int main(){int i,x,y,j;freopen("a.txt","r",stdin);scanf("%d%d",&n,&m);for (i=0;i<m;i++){scanf("%d%d",&x,&y);a[x][y]=1;}for (i=1;i<=n;i++)//从邻接矩阵转向量可以防止重复for (j=1;j<=n;j++)if (a[i][j]==1)M[i].push_back(j);for (t=1;t<=n;t++)//dfs每个点{ans=false;memset(vis,false,sizeof(vis));for (i=0;i<M[t].size();i++)//把下一个dfs,可以防止一dfs就返回 {dfs(M[t][i]);if (ans==true)//一搜到环就结束{printf("T\n");break;}}if (ans==false)//找不到环printf("F\n");}return 0;}

bfs:一般应用于求最短路。搜到终点即可结束

题目:http://www.gdfzoj.com/oj/contest/150/problems/10

一句话:用队列实现

PS:一般不会多次bfs(每个点都bfs)

#include <cstdio>#include <algorithm>#include <queue>#include <cstring>using namespace std;struct node{int x,y,t;};const int maxSize=1000;char c[maxSize+5][maxSize+5];node p1;int n,m;queue <node> q;int vis[maxSize+5][maxSize+5],f[maxSize+5][maxSize+5];int fx[4][2]={{1,0},{-1,0},{0,1},{0,-1}};void bfs(){int i,t;node p,q1;while (!q.empty()){q1=q.front();q.pop();for (i=0;i<4;i++){p.x=q1.x+fx[i][0];p.y=q1.y+fx[i][1];if (p.x<0 || p.x==m || p.y<0 || p.y==n)continue;if (vis[p.x][p.y]==0 && c[p.x][p.y]!='X'){vis[p.x][p.y]=1;f[p.x][p.y]=f[q1.x][q1.y]+1;q.push(p);}}}memset(vis,0,sizeof(vis));q.push(p1);t=0;while (!q.empty()){q1=q.front();q.pop();p.t=q1.t+1;for (i=0;i<4;i++){p.x=q1.x+fx[i][0];p.y=q1.y+fx[i][1];if (p.x<0 || p.x==m || p.y<0 || p.y==n)continue;if (c[p.x][p.y]=='E'){printf("%d\n",p.t); t=1;while (!q.empty())q.pop();break;}if (vis[p.x][p.y]==0 && c[p.x][p.y]!='X' && f[p.x][p.y]>p.t){vis[p.x][p.y]=1;q.push(p);}}}if (t==0)printf("YYR is extremely dangerous!\n");}int main(){int i,j;node n1;freopen("a.txt","r",stdin);while (scanf("%d%d",&m,&n)){if (m==0)break;memset(c,0,sizeof(c));memset(vis,0,sizeof(vis));memset(f,0,sizeof(f));for (i=0;i<m;i++){scanf("%s",&c[i]);for (j=0;j<n;j++){if (c[i][j]=='P'){p1.x=i;p1.y=j;p1.t=0;}else if (c[i][j]=='D'){n1.x=i;n1.y=j;vis[i][j]=1;q.push(n1);}}}bfs();}return 0;}