【题目】
D. Lunar New Year and a Wander
【题解】
题意:给你一个n个顶点m条边的无向连通图,沿着边走,每次遇到一个没走过的新顶点就记录下来,让你输出字典序最小的记录方式。给的边会存在多条连接相同两个顶点的情况和自环的情况。
思路:建立邻接表把顶点i的所有邻接点压入vec[i]。字典序最小当然从1开始走,把当前最小可到达点取出来压入队列queue,然后再把当前最小可到达点的所有邻接点插入到set。set有自动排序去重的功能,默认升序,那么第一个元素就是我们要找的下一个最小可到达点,然后记得删除压入queue的第一个元素。重复上述步骤,直到所有顶点都被压入queue,最后按queue顺序输出即可。
【代码】
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
vector <int> vec[100005];
int vis[100005]={0};
int main()
{
int n,m; scanf("%d%d",&n,&m);
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
if(u==v) continue;
vec[u].push_back(v);
vec[v].push_back(u);
}
queue <int> q; set <int> se;
int pos=1,sum=1; vis[pos]=1;
q.push(1);
while(sum<n)
{
for(int i=0;i<vec[pos].size();i++)
if(vis[vec[pos][i]]==0)
se.insert(vec[pos][i]);
set <int>::iterator it=se.begin();
pos=*it; vis[pos]=1;
se.erase(se.begin());
q.push(pos),sum++;
}
sum=0;
while(!q.empty())
{
sum++;
printf(sum==n?"%d\n":"%d ",q.front());
q.pop();
}
return 0;
}