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;
}