D. Lunar New Year and a Wander bfs+优先队列

D. Lunar New Year and a Wander bfs+优先队列

题意

给出一个图,从1点开始走,每个点至少要经过一次(可以很多次),每次经过一个没有走过的点就把他加到走过点序列中,问最小字典序的序列是多少

思路

起始就是从每次可达的点的选取最小的那个走,拓展可达的点,然后重复直到走完了全部为止,直接用个bfs+优先队列即可

#include<bits/stdc++.h>
#include<stdlib.h>
using namespace std;
const int maxn = 3e5+5;
typedef long long ll;
#define F first
#define S second
#define pb push_back
#define pii pair<int ,int >
int a[maxn],c[maxn];
vector<int>G[maxn];
int vis[maxn];

bool cmp(int x,int y){
    char num1[10],num2[10];
    sprintf(num1,"%d",x);
    sprintf(num2,"%d",y);
    int len1=strlen(num1),len2=strlen(num2);
    for(int i=0;i<min(len1,len2);i++){
        if(num1[i]>num2[i]){
                return 0;
        }
        else if(num1[i]<num2[i])return 1;
    }
    return len1<=len2;

}
priority_queue<int,vector<int>,greater<int> >q;
void bfs(){
    q.push(1);
    vis[1]=1;
    while(!q.empty()){
        int tmp=q.top();
        q.pop();
    cout<<tmp<<" ";
        for(int i=0;i<G[tmp].size();i++)
        {
            int y=G[tmp][i];
            if(!vis[y]){q.push(y);vis[y]=1;}
        }
    }
}
int main(){
    int n,m,t,d;
    scanf("%d%d",&n,&m);
    int x,y;
    for(int i=0;i<m;i++){
        scanf("%d%d",&x,&y);
        G[x].pb(y);
        G[y].pb(x); 
    }

    bfs();

    return 0;
}
全部评论

相关推荐

11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
11-26 22:34
已编辑
重庆邮电大学 Java
快手 客户端开发 (n+5)k*16 公积金12
牛客895077908号:佬 什么双非硕啊
点赞 评论 收藏
分享
死在JAVA的王小美:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,我也是,让我免了一轮,但是硬气拒绝了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务