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

[题解]P10231 [COCI 2023/2024 #4] Putovanje

思路

考虑从每一个 \(d_i \neq -1\) 的点开始往外走 \(d_i\) 步,然后所有这些点走到的点的集合取交集就是答案,复杂度是 \(\Theta(n^2)\) 的。

注意到我们需要对一些集合取交,容易想到 bitset 优化,此时的复杂度瓶颈在于 BFS 的次数。

因为 \(u \leadsto v\) 的最短路等于 \(v \leadsto u\) 的最短路,考虑将原先的起点看作终点,从原先的起点倒着走走到原来的终点,每一步距离为 \(-1\)

可以直接上多源 Dijkstra,判断每一个 \(d_u \neq 1\) 是否和跑出来的 \(dis_u\) 相同即可。因为边权全部为 \(-1\) 可以把 Dijkstra 换成 BFS,实现上当队顶的 \(dis_u > d_x\) 时将 \(x\) 丢到队列里面即可。

最后复杂度是 \(\Theta(\frac{nm}{\omega})\)

Code

#include <bits/stdc++.h>
#define re registerusing namespace std;const int N = 5e4 + 10,M = 2e5 + 10;
int n,m,tot,now;
int d[N],dis[N];
int idx,h[N],ne[M],e[M];
bitset<N> tmp,st[N];
vector<int> ans,S[N];inline int read(){int r = 0,w = 1;char c = getchar();while (c < '0' || c > '9'){if (c == '-') w = -1;c = getchar();}while (c >= '0' && c <= '9'){r = (r << 3) + (r << 1) + (c ^ 48);c = getchar();}return r * w;
}inline void add(int a,int b){ne[idx] = h[a];e[idx] = b;h[a] = idx++;
}inline void bfs(){queue<int> q;fill(dis,dis + n + 3,-1);while (!q.empty() || ~now){if (q.empty()){while (~now && S[now].empty()) now--;if (~now){for (int x:S[now]){q.push(x); dis[x] = d[x];} S[now--].clear();}}else if (dis[q.front()] == now){for (int x:S[now]){q.push(x); dis[x] = d[x];} S[now--].clear();}if (q.empty()) break;int u = q.front(); q.pop();if (~d[u] && d[u] != dis[u]){puts("0"); exit(0);}if (!dis[u]) continue;for (re int i = h[u];~i;i = ne[i]){int v = e[i];if (!~dis[v] || dis[v] == dis[u] - 1){if (!~dis[v]) q.push(v);st[v] |= st[u]; dis[v] = dis[u] - 1;}}}
}int main(){memset(h,-1,sizeof(h));n = now = read(),m = read();for (re int i = 1,a,b;i <= m;i++){a = read(),b = read();add(a,b); add(b,a);}for (re int i = 1;i <= n;i++){tot += ~(d[i] = read());st[i][i] = 1;if (~d[i]){tmp[i] = 1; S[d[i]].push_back(i);}} bfs();for (re int i = 1;i <= n;i++){if ((!dis[i] || !~dis[i]) && (st[i] & tmp) == tmp) ans.push_back(i);} printf("%d\n",ans.size());for (int x:ans) printf("%d ",x);return 0;
}
http://www.zskr.cn/news/13053.html

相关文章:

  • WPF Prism register interface and service, view and viewmodel, IRegionManager, RequestNavigate
  • 让YOLO飞起来:从CPU到GPU的配置指南
  • 忘形篇
  • 1748:约瑟夫问题
  • 候机的队伍
  • Keil uVision5 设置 hex 输出路径,不放Objects目录下
  • 垃圾收集器G1ZGC详解
  • gen-ui-python
  • 2025国内裱纸机厂家最新推荐排行榜:聚焦智能高速与全自动机型,权威精选综合实力 TOP3 厂家
  • 使用Windbg分析dmp文件的方法以及实战分析实例分享 - 教程
  • Vivado兼容第三方软件工具对照表Modelsim,Questasim,Matlab
  • 2025 年电脑租赁公司最新推荐排行榜:深度解析 TOP3 优质租电脑公司,助企业个人租赁电脑选择指南
  • 完整教程:✨WPF编程基础【1.2】:XAML中的属性
  • 使用JOL查看对象布局
  • 短视频流量|基于SprinBoot+vue的短视频流量数据分析系统(源码+数据库+文档) - 指南
  • 一天一款实用的AI工具,第4期,AI翻译成英语
  • 初次尝试在kubernetes 1.31 上安装 人工智能模型运行平台 llm-d - 详解
  • 源码反码补码
  • Python + MediaPipe 手势绘画高级应用:从基础到创意交互 - 实践
  • Github 12.3kstar, 3分钟起步做中后台?Go+Vue 脚手架,把权限、代码生成、RBAC 都封装好了
  • 完整教程:多线程——单例模式
  • A Twisty Movement
  • 完整教程:iOS 混淆与反调试反 Hook 实战,运行时防护、注入检测与安全加固流程
  • Attention进阶史(MHA, MQA, GQA, MLA)
  • 实用指南:AI编程时代的变革:Replit CEO对话深度解析
  • 2025推拉门品牌推荐榜:聚焦玻璃推拉门,钛镁合金推拉门选择指南
  • 9-27
  • PolarDN PIoTS 简单
  • 4-3〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸本地资料涵盖漏洞-A
  • 第七章 手写数字识别V4