• 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;
    }
    
  • 相关阅读:
    P2788 数学1(math1)- 加减算式
    数据库第三章-学习笔记
    字典序
    P1739 表达式括号匹配
    P3742 umi的函数
    P1765 手机
    P2192 HXY玩卡片
    全排函数c++ next_permutation()
    11.css定义下拉菜单
    10.php引用(&)详解及注意事项
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/10800729.html
Copyright © 2020-2023  润新知