当前位置: 首页 > news >正文

P2416 泡芙 题解

P2416 泡芙 题解

题目传送门

我的博客

前言

笔者一开始写了一版 \(O(NQ)\) 的,竟然没有TLE?(但是WA了,且做法假了

本题做法:tarjan缩点+LCA。

思路

拿到这个题首先研究样例,发现样例中竟然有环。如下图。有环怎么办?

根据题意,我们可以得知,在一个环中的每一条边都可以走一遍。因此我们可以先把环缩成一个点,将环内的边权全部转化为缩点之后的点权。

缩点之后,剩下的边保证是一个树。此时我们不难想到,可以用倍增的思想,看一看路径上是否有边权为 \(1\) 的边(即是否有泡芙)。别忘记某一个点可能是一个环缩成的,所以也要考虑这个点的点权!

所以最终统计的就是

\[dis(u,lca(u,v))+dis(lca(u,v),v)+val_{lca(u,v)} \]

代码

const int N=3e5+10;
const int INF=0x3f3f3f3f;
int n,m,Q;
struct nodein{int x,y,z;
}in[N];//记录缩点之前的读入,方便建新图
struct edge{int nxt,to,w;
}e[N*10];//如果算不准开多大,空间足够的情况下尽可能开大一点
int head[N],num_Edge=0;
void add_Edge(int from,int to,int w){e[++num_Edge].nxt=head[from];e[num_Edge].to=to;e[num_Edge].w=w;head[from]=num_Edge;
}
//tarjan板子
int dfn[N],low[N],dfscnt=0;
int scc[N],sc=0,w[N];
int st[N],top=0;
void tarjan(int u,int fa){//这里的 fa 并不是父结点,而是读入时边的编号
//这里是改的时候懒得再改了,所以直接写了 fa。下文的 e[i].w 是懒得再开一个数组了。dfn[u]=low[u]=++dfscnt;st[++top]=u;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(fa==e[i].w) continue;//e[i].w 表示读入时边的编号。if(!dfn[v]){tarjan(v,e[i].w);low[u]=min(low[u],low[v]);}else {low[u]=min(low[u],dfn[v]);}}if(dfn[u]==low[u]){sc++;while(st[top]!=u&&top){scc[st[top]]=sc;top--;}scc[st[top]]=sc;top--;		}
}
//以上------tarjan板子
//LCA板子
int ff[N][50],dep[N],sum[N];
void init_lca(){//初始化for(int j=1;j<=25;j++){for(int i=1;i<=n;i++){ff[i][j]=ff[ff[i][j-1]][j-1];}}
}
void dfs(int u,int fa){ff[u][0]=fa;dep[u]=dep[fa]+1;sum[u]+=w[u];//注意这里要累加点权for(int j=1;j<=25;j++){ff[u][j]=ff[ff[u][j-1]][j-1];}for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==fa) continue;sum[v]=sum[u]+e[i].w;//更新之前累加点权!!!这里调了20分钟dfs(v,u);}
}
int lca(int x,int y){if(dep[x]<dep[y]) swap(x,y);for(int i=25;i>=0;i--){if(dep[ff[x][i]]>=dep[y]) x=ff[x][i];//注意可以取等!}if(x==y) return x;for(int i=25;i>=0;i--){if(ff[x][i]!=ff[y][i]){x=ff[x][i],y=ff[y][i];}}return ff[x][0];
} 
//以上LCA板子---------
signed main(){n=Read();m=Read();for(int i=1;i<=m;i++){int x=Read(),y=Read(),z=Read();add_Edge(x,y,i);//from,to,idadd_Edge(y,x,i);in[i]=(nodein){x,y,z};}for(int i=1;i<=n;i++){if(!dfn[i]) tarjan(i,0);}for(int i=1;i<=n;i++) head[i]=0;//别忘了清空 head 数组!num_Edge=0;//这里为了缩减码量直接清空用了同一个数组for(int i=1;i<=m;i++){int u=scc[in[i].x],v=scc[in[i].y];if(u==v) w[u]+=in[i].z; //累加点权if(u!=v){//建新图add_Edge(u,v,in[i].z);add_Edge(v,u,in[i].z);}}init_lca();dfs(1,0);Q=Read();while(Q--){int x=Read(),y=Read();int fx=scc[x],fy=scc[y];if(fx==fy){//在一个环里,直接判断环内是否有边权为 1 的边if(w[fx]) puts("YES");else puts("NO");} else {int f=lca(fx,fy);if(sum[fx]+sum[fy]-2*sum[f]+w[f]>0) puts("YES");else puts("NO");}}return 0; 
}
http://www.gsyq.cn/news/41632.html

相关文章:

  • post表单提交接口测试
  • AI元人文构想:人机共生智慧文明治理新范式整理报告
  • 2025年湖南专利申请公司权威推荐榜单:期刊论文公司/专著合著出版公司/重点课题申报服务机构精选
  • 基础HTTP GET接口请求测试
  • HTTPPOST表单提交接口测试
  • 能变声的录放音语音芯片WT2003Hx
  • 2025年知名的多品种小批量零件机械加工TOP实力厂家推荐榜
  • 2025年智能铝合金门窗定制厂家权威推荐榜单:智能门窗控制系统/高性能系统门窗/高性能节能门窗源头厂家精选
  • 2025年铝合金锯片厂家权威推荐榜单:超薄铝用锯片/断桥铝锯片/金刚石锯片源头厂家精选
  • MySQL中如何定位慢查询?explain命令
  • 2025年6月deepseek关键词排名优化品牌榜:五家服务商数据对照解析
  • 2025年口碑好的进口制冷压缩机优质厂家推荐榜单
  • 2025年铝合金锯片厂家权威推荐榜单:铝全金门窗锯片/切散热器锯片/金刚石锯片源头厂家精选
  • 2025 年 11 月微晶石墨粉,导电石墨粉,鳞片石墨粉厂家最新推荐,精准检测与稳定性能深度解析!
  • 2025年知名的Cr12MoV模具钢最新TOP厂家排名
  • 2018年下半年试题四:论NoSQL数据库手艺及其应用
  • 2025 年 11 月展厅设计公司权威推荐榜:企业展厅/数字展厅/科技展馆/全屋定制展厅设计制作,专业策划与创意呈现口碑之选
  • 2025年热门的太空梭游乐设施用户口碑最好的厂家榜
  • 2025年比较好的赛事旗帜定制热门厂家推荐榜单
  • 2025 年 11 月开窗器厂家推荐排行榜,开窗器链条,开窗器机芯,开窗器配件,优质开窗器公司推荐
  • 2025 年最新推荐石墨粉生产厂家口碑榜单:甄选行业优质厂家解析产品品质与服务能力润滑石墨粉/土状石墨粉/高碳石墨粉公司推荐
  • 2025年知名的粉末TAIC交联剂厂家推荐及选择指南
  • 2025年质量好的dn40镀锌钢管厂家推荐及选择指南
  • 强强联合 | 利驰软件上海策永电气数字化项目启动会圆满举行
  • 2025年知名的实验室密炼机厂家推荐及采购指南
  • 上下游供应链传输文件是什么?主要有哪几种安全保护措施?
  • 2025年山东组合式铝合金桥架直销厂家权威推荐榜单:阻燃铝合金桥架/专业生产铝合金桥架/新型铝合金电缆桥架源头厂家精选
  • 2025年靠谱的多媒体沙盘模型厂家最新热销排行
  • 2025年香菇品牌口碑推荐榜单前十名深度解析
  • 2025年11月中国枸杞品牌综合推荐排行榜单:品质与健康的完美选择