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

[题解]P8186 [USACO22FEB] Redistributing Gifts S

P8186 [USACO22FEB] Redistributing Gifts S

对于每行的初始礼物,将它和左侧的礼物连单向边。

最后,每个点都可以通过交换获得所在强连通分量上的任意一个礼物,而其他礼物则无法获得。

image

可以用 Floyd 跑传递闭包(即判断有向图中两点是否连通)。时间复杂度 \(O(n^3)\)\(O(\dfrac{n^3}{\omega})\)bitset 优化)。

也可以用 Tarjan 跑一遍强连通。时间复杂度 \(O(n^2)\)

Floyd 979ms
#include<bits/stdc++.h>
#define eb emplace_back
using namespace std;
const int N=502;
int n,a[N][N],d[N][N];
vector<int> G[N];
signed main(){cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) cin>>a[i][j];for(int j=1;j<=n;j++){if(a[i][j]==i) break;d[i][a[i][j]]=1;G[i].eb(a[i][j]);//先记录出边}}for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){d[i][j]|=d[i][k]&&d[k][j];}}}for(int i=1,flg;i<=n;i++){flg=0;for(int j:G[i]){if(d[j][i]){//若出边能回来 说明有环cout<<j<<"\n";flg=1;break;}}if(!flg) cout<<i<<"\n";}return 0;
}
Floyd bitset 301ms
#include<bits/stdc++.h>
#define eb emplace_back
using namespace std;
const int N=502;
int n,a[N][N];
bitset<N> d[N];
vector<int> G[N];
signed main(){cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) cin>>a[i][j];for(int j=1;j<=n;j++){if(a[i][j]==i) break;d[i][a[i][j]]=1;G[i].eb(a[i][j]);//先记录出边}}for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){if(d[i][k]) d[i]|=d[k];}}for(int i=1,flg;i<=n;i++){flg=0;for(int j:G[i]){if(d[j][i]){//若出边能回来 说明有环cout<<j<<"\n";flg=1;break;}}if(!flg) cout<<i<<"\n";}return 0;
}
Tarjan 292ms
#include<bits/stdc++.h>
#define eb emplace_back
using namespace std;
const int N=502;
int n,a[N][N],dfn[N],low[N],tim,c[N],idx;
vector<int> G[N];
stack<int> st;
bitset<N> vis;
inline void tarjan(int x){low[x]=dfn[x]=++tim;st.push(x),vis[x]=1;for(int i:G[x]){if(!dfn[i]) tarjan(i),low[x]=min(low[x],low[i]);else if(vis[i]) low[x]=min(low[x],dfn[i]);}if(dfn[x]==low[x]){++idx;while(1){int t=st.top();st.pop(),vis[t]=0,c[t]=idx;if(t==x) break;}}
}
signed main(){cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) cin>>a[i][j];for(int j=1;j<=n;j++){if(a[i][j]==i) break;G[i].eb(a[i][j]);}}for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(c[a[i][j]]==c[i]){cout<<a[i][j]<<"\n";break;}}}return 0;
}
http://www.jsqmd.com/news/27020/

相关文章:

  • Cohesity NetBackup 11 for Linux Windows - 领先的企业备份和恢复解决方案
  • JEB Pro v5.33 (macOS, Linux, Windows) - 逆向工程平台
  • 2025年知名的大连装修效果图家装方案优选排行
  • 2025年评价高的杭州房屋装修热门口碑推荐
  • 【转载】Opencv 中 waitkey() 0xFF,“0xFF”的作用解释「建议收藏」
  • HSV(三通道)———— H(色相) S(饱和度) V(明度)
  • 「比赛游记」CSP2025 游记
  • 2025年10月脸颊有晒斑产品推荐榜:五款淡斑精华实测排行与解析
  • 应用安全 --- PC安全 之 VMP2 IAT修复
  • 2025年10月又红又痒用什么产品对比榜:五款精华舒缓泛红瘙痒实测
  • 2025年10月熬夜急救产品推荐榜:敏感肌可用急救精华排行
  • 2025年10月熬夜急救产品榜单:从暗沉到透亮的效果排行
  • 从损坏/格式化/删除的源中提取数据的 7 款数据恢复软件
  • 2025年10月干皮精华产品推荐榜:权威数据下的五强精华评价
  • 2025年10月干皮精华产品评测榜:五款热门单品吸收度与舒缓力排名
  • 2025年10月色斑淡化产品推荐评测:权威榜单帮你锁定淡斑利器
  • 2025年10月色斑淡化产品评测榜:从传明酸到烟酰胺浓度全解析排行
  • Mac 数据恢复软件方案:最好的 Mac 数据恢复软件榜单
  • 回收站恢复:Windows 和 Mac 用户完整指南
  • 适用于 Windows 11 的分区恢复软件,帮您轻松恢复删除或丢失的分区
  • 2025年评价高的馄饨皮叠皮机厂家推荐及选购参考榜
  • CF
  • Odoo会计对账原理、操作说明及常见问题
  • LLM学习记录DAY13
  • JBoltAI:让企业级Java应用快速进入AI时代
  • 2025年10月黄褐斑改善产品推荐榜:五款热门单品横向对比排行
  • 2025年10月黄褐斑改善产品口碑榜:五款温和淡斑单品排名一览
  • 当AI遇上Java团队:一个IT负责人的真实困境
  • 读AI赋能13读后总结与感想兼导读
  • SM45640_SaveTJ保存并提交