【图论】【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; }
相关文章推荐
- 【7.13考试第二题】RQNOJ190 拦截匪徒
- 第二次考试 (图论)第二题 拦截匪徒
- RQNOJ - 190 拦截匪徒 重庆一中高2018级竞赛班第二次测试 2016.7.13 Problem 2
- 【图论】【RQNOJ】智捅马蜂窝
- 【图论】【RQNOJ】造路行动
- 【图论】【RQNOJ】心许的回忆[Special Judge]
- 【图论】【RQNOJ】最优乘车
- rqnoj[NOIP1999]拦截导弹
- RQNOJ190 拦截匪徒 (重庆一中高2018级信息学竞赛测验2) 解题报告
- 【图论】【RQNOJ】学生运输
- rqnoj[NOIP1999]拦截导弹
- rqnoj-217-拦截导弹-最长不上升子序列以及不上升子序列的个数
- 【图论】【RQNOJ】校园迷宫
- 【图论】【RQNOJ】小天狼星的访问
- Cpp环境【NOIP2012模拟题】【Vijos3013】拦截匪徒
- 【图论】【RQNOJ】产生数
- 【图论】【RQNOJ】门票系统
- 【图论】【RQNOJ】恐怖分子
- 【RQNOJ】【图论】发明测试数据
- 拦截导弹----RQNOJ_217----最长单调子序列