首页 > 其他分享 >luogu 5022

luogu 5022

时间:2022-11-04 17:14:50浏览次数:59  
标签:return int luogu void 5022 tot add include

任意选定一个城市作为起点,然后从起点开始,每次可 以选择一条与当前城市相连的道路,走向一个没有去过的城市,或者沿着第一次访问该 城市时经过的道路后退到上一个城市。当回到起点时,可以选择结束这次旅行或 继续旅行。注意每个城市都被访问到。(m<=n)

每到达一个新的城市(包括起点)时,将 它的编号记录下来。这样会形成一个长度为 n的序列。现在希望这个序列的字典序 最小

 

m<n ,贪心,从1开始,每次选序号最小的下一个点

 m==n时,是基环树,直接枚举所删的边,变为一颗树,然后同(1)

 

#include <iostream>
#include <vector>
#include <cstring> 
#include <algorithm>
using namespace std ;
 const int N=5002,M=N;
 
 
 int n,m;
 
 namespace A{
 
 int vis[N];
 int e[N*2],tot;
 vector<int> g[N];
 
 vector<int>ans;
  int re;
  
 void add(int x,int y){
     e[++tot]=y;
     g[x].push_back(tot);
 }
 int cmp(int x,int y){
     return e[x]<=e[y];
 }
 void dp(int x,int fa){
     ans.push_back(x);
     int i,y;
     sort(g[x].begin(),g[x].end(),cmp);
     
     for(i=0;i<(int)g[x].size();i++){
         y=e[g[x][i]]; if(y==fa) continue;
         dp(y,x);
     }
 }
 void solve(){
     int i,x,y;
     for(i=1;i<=m;i++) cin>>x>>y,add(x,y),add(y,x);
     dp(1,0);
     for(i=0;i<(int)ans.size();i++) cout<<ans[i]<<' ';
 }
 };
 
 namespace B{
     int tot;
 struct T{
     int x,y;
 }e[N*2];
 int vis[N];
 int qx,qy;
 vector<int>cir,A,ans;
 vector<int> g[N];
  
 void add(int x,int y){
     e[++tot].x=x,e[tot].y=y;
     g[x].push_back(tot);
 }
 int cmp(int x,int y){
     return e[x].y<=e[y].y;
 }
 
 void dp(int x,int fa){
     int i,y;
     if(vis[x]) return;
     A.push_back(x);
     vis[x]=1;
     
     for(i=0;i<g[x].size();i++){
         y=e[g[x][i]].y; 
     if(y==fa||(x==qx&&y==qy)||(x==qy&&y==qx)) continue;
         dp(y,x);
     }
 }
 void save(){
     ans.clear();
     for(int i=0;i<A.size();i++) ans.push_back(A[i]);
 }
 int chk(){
     for(int i=0;i<(int)A.size();i++){
         if(ans[i]==A[i]) continue;
         if(A[i]>ans[i]) return 0;
         else return 1;
     }
 }
 void upd(){
     if(A.size()<n) return;
     if(ans.size()==0) save();
     else if(chk()) save();
 }
 void solve(){
     int i,x,y;
     
     for(i=1;i<=m;i++) cin>>x>>y,add(x,y),add(y,x);
     for(i=1;i<=n;i++) sort(g[x].begin(),g[x].end(),cmp);
     
     for(i=1;i<=tot;i+=2){
         A.clear(); 
         memset(vis,0,sizeof vis);
         qx=e[i].x,qy=e[i].y;
         dp(1,-1);
         
         upd();
     }
     for(i=0;i<ans.size();i++) cout<<ans[i]<<' ';
 }
};
int main(){
    cin>>n>>m;
    
    if(n==m) B::solve(); else A::solve();
}

 

标签:return,int,luogu,void,5022,tot,add,include
From: https://www.cnblogs.com/towboa/p/16858421.html

相关文章

  • Luogu5518
    太闲了,推柿子!\(type=1\)\[\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^C\frac{\operatorname{lcm}\{i,j\}}{\gcd\{i,k\}}\\=\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^C\frac{......
  • luogu 3155
     m 个节点的无根树,选一个根,将一些节点染成黑色或白色。你的着色方案应保证根节点到各叶子节点的简单路径上都包含一个有色节点,哪怕是叶子本身。对于每个叶子节点 u,定......
  • Luogu P5435 基于值域预处理的快速 GCD
    最近做这道题的时候被卡常了,然后突然想起来曾经偶然在陈指导的博客看到过这个\(O(1)\)做\(\gcd\)的方法其实理解了之后还是比较简单的,以下设数的值域为\(S\)首先我们定义......
  • Luogu4315 月下“毛景树” - 树链剖分 -
    题目链接:https://www.luogu.com.cn/problem/P4315题意:一棵有边权的树,维护树上的链加、链覆盖、修改边权、链上max题解:好难写...首先把边权转化为儿子的点权然后树链剖......
  • 【luogu P1600】天天爱跑步(线段树合并)(LCA)
    天天爱跑步题目链接:luoguP1600题目大意有一棵树,给你若干条路径,对于每个点,有一个数x,求出有多少条路径的第x个点是当前点。思路考虑把路径拆成两个部分,向上和向下。......
  • 【XSY2444】【BZOJ4042】【CERC2014】【luogu4757】Parades(树形dp+状压dp)
    题面Description从前有个A国,它有\(n\)个城市和\(n-1\)条道路。每条路连接两个城市。城市之间两两可达。每个城市与不超过10条道路相连。现在给出\(m\)条路径,要求从这些......
  • luogu 1908 逆序对板子
     逆序对的本质是二维偏序 给第一维排序(输入时已排好),统计y(k)>=y(i)k<i的个数用树状数组维护y值前缀和,需要的时候直接查询该题需要离散化这个y,再作为树状数组......
  • luogu 4588
    给xx这个数进行操作1m:将 xx 变为x,并输出 x%mod2pos:将 xx 变为 xx 除以第 pos 次操作所乘的数(保证第 pos 次操作一定为类型1,对于每一个类型1的操作至多......
  • Luogu P5658 括号树
    LuoguP5658括号树来补一道当年考场上没做出来的题。不难想到树上DP,关键在于如何设置函数与转移。按题意,记$k_i$为以$s_i$结尾的串中的合法子串数;记$cnt_i$为......
  • 【luogu P6130】随机红包(数学)(期望)
    随机红包题目链接:luoguP6130题目大意把一个数1分成n份,求第k小的期望大小,多次询问。思路首先考虑最小的期望大小,那假设最小的是\(x\),剩下的都大于\(x\)。那......