您的位置:首页 > 其它

POJ 1130 Alien Security

2010-10-26 22:19 197 查看
先用DFS把必经点找出来,然后取其中到入口长度最大的那个

但是先用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: