BFS做法比DFS适合且简单,使用DFS需谨慎,容易出现bug(标记后就不再走,出现不一定能遍历所有小于等于6的路径的情况)
DFS:
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
const int N = 1010;
vector<int> g[N];
bool book[N];
double cnt;
int sheet[N];
void dfs(int x,int num){
cnt++;
book[x] = true;
sheet[x] = num;
if(num == 6) return;
for(const int &t:g[x]){
if(!book[t]){
dfs(t,num+1);
}
if(sheet[t] > num+1){//发现当前的这条路径比上次的路径短,再次更新
cnt--;//由于t这个点已经标记过,所以需要减1,防止出现重复计算
dfs(t,num+1);
}
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i = 0; i < m; i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
for(int i = 1; i <= n; i++){
memset(book,false,sizeof(book));
cnt = 0;
dfs(i,0);
cout<<i<<": ";
printf("%.2lf%%",100*cnt/n);
if(i!=n) cout<<'\n';
}
return 0;
}
BFS:
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
const int N = 1010;
vector<int> g[N];
bool book[N];
double cnt;
void bfs(int x){
cnt = 0;
queue<PII> que;
que.push({x,0});
book[x] = true;
cnt++;
while(!que.empty()){
PII tmp = que.front();
que.pop();
if(tmp.second == 6) break;
for(const int &t:g[tmp.first]){
// cout<<tmp.first<<' '<<t<<endl;
if(!book[t]){
book[t] = true;
que.push({t,tmp.second+1});
cnt++;
}
}
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i = 0; i < m; i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
for(int i = 1; i <= n; i++){
memset(book,false,sizeof(book));
bfs(i);
cout<<i<<": ";
printf("%.2lf%%",100*cnt/n);
if(i!=n) cout<<'\n';
}
return 0;
}