feat: 添加P5022题的DFS解法实现

实现基于优先队列的DFS遍历算法,用于解决图论题目P5022。使用bitset标记访问节点,确保正确遍历无向图。
This commit is contained in:
Zengtudor 2025-11-04 09:47:51 +08:00
parent 9541f97f8b
commit ce9f41f580

44
src/11/3/P5022.cpp Normal file
View File

@ -0,0 +1,44 @@
#include <bitset>
#include <cstdint>
#include <cstdio>
#include <functional>
#include <iostream>
#include <istream>
#include <queue>
#include <vector>
using ll = int64_t;
const ll maxn = 5000+7;
ll n,m;
std::vector<std::priority_queue<ll,std::vector<ll>,std::greater<ll>>> e;
std::bitset<maxn> b;
static inline void dfs(ll f,ll now){
// printf("dfs f=%lld, now=%lld\n",f,now);
std::cout<<now<<" ";
while(e[now].size()){
ll top = e[now].top();
// printf("top=%lld\n",top);
e[now].pop();
if(top==f || b[top])continue;
b[top]=true;
dfs(now,top);
}
// printf("---dfs f=%lld, now=%lld\n",f,now);
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>m;
e.resize(n+1);
for(ll i=1;i<=m;i++){
ll u,v;
std::cin>>u>>v;
e[u].push(v);
e[v].push(u);
}
dfs(0,1);
std::cout<<"\n";
}