Codeforces Round #536 (Div. 2), problem: (D) Lunar New Year and a Wander 【最小堆+bfs】

题意

求出漫步时的最小的节点顺序

思路

最小堆保证字典序最小,vis保证每个点只输出1次
用vector建立邻接表
然后一次bfs跑一遍图就好了

code

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn=1e5+5;
int n,m;
int vis[maxn];
vector<int> G[maxn];
priority_queue<int,vector<int>,greater<int> > pq;
void bfs(){
    pq.push(1);
    while(!pq.empty()){
        int u=pq.top();
        pq.pop();
        if(vis[u]) continue;
        vis[u]=1;
        cout<<u<<" ";
        for(auto v:G[u]){
            if(!vis[v])
                pq.push(v);
        }
    }
}
int main(){
    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);
    }
    bfs();
    return 0;
}
学如逆水行舟,不进则退
发布了414 篇原创文章 · 获赞 973 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/weixin_42429718/article/details/104105475