POJ 1130 Alien Security
2010-10-26 22:19
197 查看
先用DFS把必经点找出来,然后取其中到入口长度最大的那个
但是先用BFS求各点到入口的距离,从大到小排序,依次从大的开始检验是否为必经点,输出找到的第一个,这样却WA了。。。
对这道题还是没有完全理解清楚。。。
AC代码:(在原错误代码基础上修改的,有点繁杂)
但是先用BFS求各点到入口的距离,从大到小排序,依次从大的开始检验是否为必经点,输出找到的第一个,这样却WA了。。。
对这道题还是没有完全理解清楚。。。
AC代码:(在原错误代码基础上修改的,有点繁杂)
#include<iostream> #include<queue> using namespace std; struct node { int d; int v; }dis[101]; int g[101][101]; int u[101],r[101]; int n,goal; int cmp(const node &a,const node &b) { return a.d<b.d; } int dfs(int s,int del) { int i,j; if(s==goal) return 1; u[s]=1; for(i=0;i<n;i++) { if(i==del) continue; if(g[s][i]&&!u[i]) { if(dfs(i,del)) return 1; } } return 0; } void bfs() { int i,j,k,l,ans; queue<int>q; q.push(0); u[0]=1; dis[0].d=0; dis[0].v=0; while(!q.empty()) { i=q.front(); q.pop(); for(j=0;j<n+1;j++) { if(!u[j]&&g[i][j]) { dis[j].d=dis[i].d+1; dis[j].v=j; u[j]=1; q.push(j); } } } } int main() { int i,j,k,cnt,a,b,flag,suc,ans; cnt=0; suc=0; cin>>n>>goal; while(scanf("%d %d",&a,&b)!=EOF&&(a||b)) { g[a][b]=1; } bfs(); for(i=0;i<n;i++) { memset(u,0,sizeof(u)); u[dis[i].v]=1; if(dis[i].v==goal) continue; if(!dfs(0,dis[i].v)) { r[cnt++]=i; } } ans=r[0]; for(i=0;i<cnt;i++) { if(dis[r[i]].d>dis[ans].d) ans=dis[r[i]].v; } printf("Put guards in room %d./n",ans); return 0; }
相关文章推荐
- POJ 1130 Alien Security 笔记
- 广搜,深搜,单源最短路径,POJ(1130),ZOJ(1085)
- chapter05—Alien Security(POJ 1130)
- 1130 POJ#1376 Robot
- pku_1130_Alien Security
- poj 1130 Alien Security (dfs+bfs<反向最短路>)
- zoj 1130 poj 1392 Ouroboros Snake (欧拉路径)
- POJ 1130(一道纯水,bfs+dfs)
- POJ 1130
- poj 1528 Perfection
- Poj 3819 // Hdu 3425 Coverage
- poj 1920 Towers of Hanoi
- poj1696 Space Ant 点积,叉积,夹角
- POJ题目分类(算法分类较详细)
- POJ 1426/ ZOJ 1530 Find The Multiple
- poj 3900 The Robbery(dfs+剪枝,不是背包)
- poj 3465 Corn Fields 状态压缩
- poj 3525 Most Distant Point from the Sea(半平面交+二分内推进)
- POJ 3678 深刻理解2SAT
- poj1659 Frogs' Neighborhood