您的位置:首页 > 其它

【图论】【RQNOJ】拦截匪徒

2010-07-10 16:31 225 查看

题目描述

某市的地图是一个由n个点组成的无向图,每个点代表一个区。现在第p区发生了抢劫案,而警察为了借助劫匪需埋伏在一个劫匪必经的区域。由于不知道劫匪会向哪个区域逃窜,所以市长要求你计算出对于任意一个劫匪可能逃向的区j,找出一个可以借助劫匪的区k(k<>p,k<>j),即劫匪从p区逃向j区,必经过k区。由于地区j可能为匪徒的老巢所在,所以警察希望能在路上拦住匪徒,而不是在j区抓捕。

输入格式

第一行为n,p(N、P<=200)
接下来为n*n的矩阵A,Aij=1表示i区与j区有路相连,Aij=0则反之。

输出格式

输出n-1行,按顺序从j=1,2,……,p-1,p+1,……,n依次输出对于每一个警察可以在哪些点埋伏。如有多个点,要按从小到大顺序依次输出;如没有,则对应行输出“No”。

样例输入

#include<stdio.h>
#include<iostream>
using namespace std;
int a[201][201],ans[201][201];
bool v[201];
int n,p;
void dfs(int x)
{
v[x]=true;
for (int i=1;i<=n;++i)
if ((!v[i])&&(a[x][i]==1))
dfs(i);
}
int main()
{
scanf("%d%d",&n,&p);
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
scanf("%d",&a[i][j]);
dfs(p);
for (int i=1;i<=n;++i)
if (!v[i])
for (int j=1;j<=n;++j)
{
ans[i][j]=2;
ans[j][i]=2;
}
for (int i=1;i<=n;++i)
{
memset(v,false,sizeof(v));
v[i]=true;
dfs(p);
for (int j=1;j<=n;++j)
if ((!v[j])&&(ans[j][i]==0)) ans[j][i]=1;
}
for (int i=1;i<=n;++i)
if (i!=p)
{
bool t=true;
for (int j=1;j<=n;++j)
if (ans[i][j]==1)
{
t=false;
printf("%d ",j);
}
if (t) printf("No");
printf("/n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: