Codeforces Round #536 (Div. 2) D. Lunar New Year and a Wander(基础图论)

【题目】

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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值