首页 > 其他分享 >Cycling City

Cycling City

时间:2024-10-10 17:49:53浏览次数:5  
标签:City Cycling int fa vector using tof define

好不容易切一道\(*3100\),写篇题解纪念一下。

Cycling City

考虑什么时候两个点之间有三条完全不重复的路径,当且仅当这两个点在环的交接点的两端。

注意原图不是连通的,以下只考虑连通的情况,不连通的就是从树变成森林。

大概就是这样的,如图,\(2,4\)就是一个可行的,合法路径分别为\(2,3,4\quad 2,1,5,4\quad 2,6,7,4\)

image

先随意以一个为根,提出一棵树,然后将非树边依次加入,对于每条路径,记录路过其的环,这个暴力跳即可,复杂度是\(O(n\times(m-n))\)的,但是算出来实际上最大值为\(O(n\sqrt n)\)的。如果有一条路径路过的环有两个,那么就一直向上跳,找到另一端,然后统计路径即可。

树上的路径暴力跳树,环上的路径新开一个vector记录一下,输出路径即可。

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
#define rep(i,s,t,p) for(int i = s;i <= t; i += p)
#define drep(i,s,t,p) for(int i = s;i >= t; i -= p)
#ifdef LOCAL
    FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
    // FILE *ErrFile=errfile("err.err");
#else
    FILE *Infile = stdin,*OutFile = stdout;
    //FILE *ErrFile = stderr;
#endif
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
const int N = 2e5 + 10;
vector<int> have[N];
struct node{int to,id;node(int t,int i):to(t),id(i){}};
vector<node> edge[N];
#define eb emplace_back
#define add(u,v,i) edge[u].eb(node(v,i))
#define All(x) x.begin(),x.end()
int n,m,u[N],v[N],fa[N],e_tof[N],dep[N],tim;
vector<int> ring[N];
bitset<N> vis,df;
void dfs(int x){
    dep[x] = dep[fa[x]] + 1;
    df[x] = true;
    for(node i:edge[x]){
        int y = i.to,id = i.id;
        if(df[y]) continue;
        e_tof[y] = id;//记录向父亲的边
        vis[id] = true,fa[y] = x;//记录树边和父亲
        dfs(y);
    }
}
inline void assign(int x,int y){
    vector<int> ans1,ans2,ans3;
    vector<int> pd;
    bool flag = false;
    int s,t;
    while(y != x){
        have[e_tof[y]].eb(tim);
        ring[tim].eb(y);
        if(!flag && have[e_tof[y]].size() >= 2) pd = have[e_tof[y]],flag = true,s = y;//找到了一端
        y = fa[y];
    }
    ring[tim].eb(x);
    if(!flag) return;//没有,跳过
    int id1,id2;
    y = fa[s],t = y;
    while(y != fa[x]){
        if(count(All(have[e_tof[y]]),pd[0])&&count(All(have[e_tof[y]]),pd[1])) t = fa[y];//找另一端
        else break;
        y = fa[y];
    }
    cout<<"YES\n";
    y = s;
    while(y != fa[t]) ans1.eb(y),y = fa[y];//答案一,全走树边
    int len;

    //答案二,走环1
    len = ring[pd[0]].size()-1;
    rep(i,0,len,1){if(ring[pd[0]][i] == s) {id1 = i;break;}}
    rep(i,0,len,1){if(ring[pd[0]][i] == t) {id2 = i;break;}}
    drep(i,id1,0,1) ans2.eb(ring[pd[0]][i]);
    drep(i,len,id2,1) ans2.eb(ring[pd[0]][i]);

    //答案二,走环2
    len = ring[pd[1]].size()-1;
    rep(i,0,len,1){if(ring[pd[1]][i] == s) {id1 = i;break;}}
    rep(i,0,len,1){if(ring[pd[1]][i] == t) {id2 = i;break;}}
    drep(i,id1,0,1) ans3.eb(ring[pd[1]][i]);
    drep(i,len,id2,1) ans3.eb(ring[pd[1]][i]);
    cout<<ans1.size()<<' ';for(int i:ans1) cout<<i<<' ';cout<<'\n';
    cout<<ans2.size()<<' ';for(int i:ans2) cout<<i<<' ';cout<<'\n';
    cout<<ans3.size()<<' ';for(int i:ans3) cout<<i<<' ';cout<<'\n';
    exit(0);
}
inline void get(int x,int y){
    if(dep[x] > dep[y]) swap(x,y);
    assign(x,y);
}
inline void solve(){
    cin>>n>>m;
    rep(i,1,m,1){
        cin>>u[i]>>v[i];
        add(u[i],v[i],i);
        add(v[i],u[i],i);
    }
    rep(i,1,n,1) if(!df[i]) dfs(i);
    rep(i,1,m,1){
        if(vis[i]) continue;
        tim++;
        get(u[i],v[i]);
    }
    cout<<"NO\n";
}
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cout.tie(nullptr)->sync_with_stdio(false);
    solve();
}

标签:City,Cycling,int,fa,vector,using,tof,define
From: https://www.cnblogs.com/hzoi-Cu/p/18456854

相关文章

  • 【刷题笔记】[ABC281G] Farthest City
    【刷题笔记】[ABC281G]FarthestCity题意求构造一个没有重边和自环【简单联通】的无向连通图,使得\(d[n]\)严格大于\(d[i]\),问有几种构造方案思路一道\(DP\)好题\(DP\)有\(2\)种题型,求最优值问题,和计数问题。本题为计数问题。因为在边权为1的最短路中\[d[i]=d[i-1]+1\]所......
  • rgba 和 opacity 有什么区别呢?
    rgba和opacity是CSS中用于控制元素颜色和透明度的两个属性。1.rgba属性rgba是CSS中的一种颜色值,用于定义颜色和透明度(alpha通道)。它扩展了传统的RGB颜色模型,增加了一个额外的透明度(alpha)分量。格式:color:rgba(red,green,blue,alpha);即color:rgba(0,0,0,.5);re......
  • 事务 Atomicity Consistency Isolation Durability
    事务分类:原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。原子性:(Atomicity)被执行的事务要么全部成功,要么全部失败,不能只单独执行一个。例如:有两个用户A和B,A原本有1000元,B原本有500元,A向B转账200元,将执行A变成800元和B变成700元,或者A不变并且B也不变,这两......
  • 易优CMS安装时,提示在写入表ey_weapp_multicity记录失败-eyoucms
    当你在安装易优CMS时遇到“写入表ey_weapp_multicity记录失败”的提示时,这通常意味着在安装过程中数据库出现了问题,可能是由于数据库连接问题、权限问题、数据冲突等原因造成的。以下是一些可能的解决步骤:步骤1:检查数据库连接确认数据库连接信息确保数据库连接信息(主机名......
  • MISC - 第四天(OOK编码,audacity音频工具,摩斯电码,D盾,盲文识别,vmdk文件压缩)
    前言各位师傅大家好,我是qmx_07,今天继续讲解MISC知识点FLAG附件是一张图片,尝试binwalk无果使用StegSolve工具DataExtract查看时发现PK字段,是大多数压缩包的文件头点击SaveBin保存zip文件解压缩失败使用修复软件:http://forspeed.onlinedown.net/down/95222_201706......
  • SQLSTATE[42S02]: Base table or view not found: 1146 Table '***.ey_citysite' does
    根据提供的错误信息 SQLSTATE[42S02]:Basetableorviewnotfound:1146Table'***.ey_citysite'doesn'texist,这个错误表明数据库中不存在名为 ey_citysite 的表或视图。以下是一些可能的解决步骤:1.确认表是否存在首先确认表是否真的存在。使用SQL命令检查表可以......
  • Linux内核中cpu_capacity是什么?
    cpu_capacity在Linux内核中,cpu_capacity是用于表示每个CPU的处理能力的一个参数,通常用于调度器的负载均衡。它表明不同的CPU核心在计算资源分配中的相对性能,尤其在异构多核架构(如ARM的big.LITTLE架构)中,不同的核心可能具有不同的计算能力。主要概念同构和异构架构:在同构架......
  • Tenacity -- Retrying library for Python
    RetryinglibraryforPythonhttps://github.com/jd/tenacity Pleaserefertothetenacitydocumentationforabetterexperience.TenacityisanApache2.0licensedgeneral-purposeretryinglibrary,writteninPython,tosimplifythetaskofaddingretry......
  • 返回到互联5年,精心打磨建站利器(城市分站AllCity)让你轻松建网站立马赢出来
    建立城市分站有什么优点?城市分站是指在当前城市范围内建立一个网站,以实现该城市的信息全面覆盖和更好的用户体验。目的是为了满足当地不同用户的需求,提供更加个性化和本地化的服务。在建立城市分站时,需要考虑以下几个方面:1.确定站点主题和定位首先需要确定每个站点的主题和......
  • 抛物线绘制 代码 ForceMode.VelocityChange,这种模式,忽略质量变化的影响 , 质量默认为1
    publicLineRenderer线渲染器;publicVector3[]线的点们=newVector3[60];publicTransform发射点;publicfloat力度=10;publicfloat细分长度=.02f;publicGameObject子弹;voidUpdate(){for(intfFor=0;fFor<线的点们.Length;f......