'commit'
This commit is contained in:
49
TangDou/LuoGuBook/P2853_Dfs_3.cpp
Normal file
49
TangDou/LuoGuBook/P2853_Dfs_3.cpp
Normal file
@@ -0,0 +1,49 @@
|
||||
#include <bits/stdc++.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
const int N = 1010; //牧场数上限
|
||||
|
||||
int n; //n个牧场
|
||||
int m; //m条有向路连接
|
||||
int K; //k只奶牛
|
||||
int ans; //ans为最终答案
|
||||
int g[N][N]; //g数组为邻接矩阵
|
||||
int a[N]; //a数组存储牛的位置
|
||||
int sum[N]; //sum数组为每个点被遍历的次数
|
||||
bool st[N]; //st数组用来判断点是否已经被访问过
|
||||
|
||||
//进行图的深度优先遍历
|
||||
void dfs(int x) {
|
||||
st[x] = true; //将现在访问的点标记为已遍历,防止走回头路
|
||||
sum[x]++; //将这个点遍历的次数+1
|
||||
//枚举节点编号
|
||||
for (int i = 1; i <= n; i++)
|
||||
//如果当前节点没有被访问过并且与当前节点有边连接
|
||||
if (!st[i] && g[x][i]) dfs(i);//就遍历i号节点
|
||||
}
|
||||
|
||||
int main() {
|
||||
cin >> k >> n >> m;
|
||||
for (int i = 1; i <= k; i++) cin >> a[i];//输入每只奶牛的顺序
|
||||
|
||||
//使用邻接矩阵保存数据边
|
||||
for (int i = 1; i <= m; i++) {
|
||||
int u, v;
|
||||
cin >> u >> v;
|
||||
//连接两边(注意不是双向边,是单向边)
|
||||
g[u][v] = 1;
|
||||
}
|
||||
//对奶牛的位置进行枚举
|
||||
for (int i = 1; i <= k; i++) {
|
||||
dfs(a[i]); //从每一只奶牛的位置开始遍历
|
||||
memset(st, false, sizeof(st)); //记得每次遍历完都需要清空标记数组
|
||||
}
|
||||
//统计答案,如果当前节点被访问的次数恰好为奶牛的只数
|
||||
for (int i = 1; i <= n; i++)
|
||||
if (sum[i] == k) ++ans;
|
||||
|
||||
//输出最后答案
|
||||
cout << ans << endl;
|
||||
return 0;//完美结束
|
||||
}
|
||||
Reference in New Issue
Block a user