//题目大意:输入也有向图,深搜k层,计算k层遍历到的总人数
//深搜,有两个测试点不过???
/*#include<bits/stdc++.h>
#define MAXN 1005
using namespace std;
int M, k;
int G[MAXN][MAXN];
int visit[MAXN];
void DFS(int nowvisit, int nowdep, int &sum){
if(nowdep == k){
return;
}
for(int i = 1; i <= M; i++){
if(G[nowvisit][i] == 1 && visit[i] == 0 && i != nowvisit){
sum++;
visit[i] = 1;
DFS(i, nowdep+1, sum);
//visit[i] = 0; //防止重复计点——此处不是查找最短路径。
}
}
}
int main(){
int nfrom, from;
cin >> M >> k;
for(int i = 1; i <= M; i++){
cin >> nfrom;
if(from){
for(int j = 0; j < nfrom; j++){
cin >> from;
G[from][i] = 1;
}
}
}
int nd, num;
cin >> nd;
for(int i = 0; i < nd; i++){
cin >> num;
memset(visit, 0, sizeof(visit));
int sum = 0;
visit[num] = 1;
DFS(num, 0, sum);
cout << sum << endl;
}
return 0;
}
*/
//测试点全过
#include<bits/stdc++.h>
#define MAXN 1005
using namespace std;
int M, k;
int G[MAXN][MAXN];
int visit[MAXN];
struct node{
int depth;
int nowvisit;
};
void BFS(int begin_n, int &sum){
queue<node> p;
node n1 = {0, begin_n};
p.push(n1); //queue:push(), vector:push_back()
node head, next;
while(!p.empty()){
head = p.front(); p.pop();
if(head.depth == k){
return;
}else {
for(int i = 1; i <= M; i++){
if(G[head.nowvisit][i] == 1 && visit[i] == false){
sum++;
next.depth = head.depth+1;
next.nowvisit = i;
p.push(next);
visit[i] = true;
}
}
}
}
}
int main(){
int nfrom, from;
cin >> M >> k;
for(int i = 1; i <= M; i++){
cin >> nfrom;
if(from){
for(int j = 0; j < nfrom; j++){
cin >> from;
G[from][i] = 1;
}
}
}
int nd, num;
cin >> nd;
for(int i = 0; i < nd; i++){
cin >> num;
memset(visit, 0, sizeof(visit));
int sum = 0;
visit[num] = 1;
BFS(num, sum);
cout << sum << endl;
}
return 0;
}
1076-有向图的k层遍历-深搜+广搜
最新推荐文章于 2020-03-29 14:37:53 发布