Codeforces Round #536 (Div. 2) D. Lunar New Year and a Wander(优先队列)

Description:

给出一个n节点m边的无向图,现在从1号点开始随便走,每次走过一个未经过的点时就记录下该点的编号,问所能得到的最小字典序的记录是什么。

Input:

n m 和无向图

Output:

一条路径

Analysis:

用优先队列即可,队列中全部都是下一步可达的点,贪心地去选择最小编号的点正好符合字典序小的要求。

#define _CRT_SECURE_NO_WARNINGS  
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<sstream>
#include<cmath>
#include<iterator>
#include<bitset>
#include<stdio.h>
#include<unordered_set>
#include<ctime>
#include<cstring>
using namespace std;
#define _for(i,a,b) for(int i=(a);i<(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
typedef long long LL;
const int INF = 1 << 30;
const int maxn = 100005;
const int MOD = 1e9+7;
const double eps = 1e-6;

int n, m;
vector<int> G[maxn];
int vis[maxn];
vector<int> ans;


int main()
{

	while (scanf("%d%d", &n, &m) == 2) {
		_rep(i, 1, n)G[i].clear();
		for (int i = 0; i < m; ++i) {
			int u, v; scanf("%d%d", &u, &v);
			G[u].push_back(v);
			G[v].push_back(u);
		}
		priority_queue<int, vector<int>, greater<int> >Q;
		memset(vis, 0, sizeof(vis));
		ans.clear();
		Q.push(1);
		while (Q.size()) {
			int u = Q.top();
			Q.pop();
			vis[u] = 1;
			ans.push_back(u);
			for (auto v : G[u]) {
				if (!vis[v]) {
					vis[v] = 1;
					Q.push(v);
				}
			}
		}
		for (auto it : ans)cout << it << " ";
		cout << endl;
	}


	return 0;
}

猜你喜欢

转载自blog.csdn.net/tomandjake_/article/details/86821913