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

ARC092F - Two Faced Edges - Link

考虑反转一条边 \(u\rightarrow v\) 后强连通分量数量变化的条件。

  1. 如果 \(v\) 能到 \(u\)\(u\)\(v\) 必须经过这条边,那么翻转后强连通分量数量会减少。
  2. 如果 \(v\) 不能到 \(u\)\(u\)\(v\) 可以不经过这条边,那么翻转后强连通分量会变多。

如果不符合以上两种情况,翻转后强连通分量数量不变。
现在对于每一条边 \(u\rightarrow v\),只需要求出 \(v\) 是否能到 \(u\),以及 \(u\rightarrow v\) 的路径中该边是否为必经边。
第一个简单,直接 \(\mathcal{O}(n\times m)\) 暴力求。第二个是个经典问题可是我不会
具体的,对于一个点 \(u\),正序遍历 \(u\) 的每一条出边,只访问没被标记的点,给他们打上这个边的标记,这个被称之为第一次遍历。然后清空访问数组,反着遍历 \(u\) 的每一条出边,如果点 \(v\) 在第一次遍中被打的边标记和当前访问到 \(v\) 的边不是同一条边,那就有至少两种路径从 \(u\)\(v\),否则只有一种。这样就可以在 \(\mathcal{O}(n\times m)\) 的时间内求出每一条边是否为必经边了。
查寻直接判断。
总时间复杂度 \(\mathcal{O}(n\times m)\)

代码

#include<bits/stdc++.h>
using namespace std;
namespace IO{template<typename T>inline void read(T&x){x=0;char c=getchar();bool f=0;while(!isdigit(c)) c=='-'?f=1:0,c=getchar();while(isdigit(c)) x=x*10+c-'0',c=getchar();f?x=-x:0;}template<typename T>inline void write(T x){if(x==0){putchar('0');return ;}x<0?x=-x,putchar('-'):0;short st[50],top=0;while(x) st[++top]=x%10,x/=10;while(top) putchar(st[top--]+'0');}inline void read(char&c){c=getchar();while(isspace(c)) c=getchar();}inline void write(char c){putchar(c);}inline void read(string&s){s.clear();char c;read(c);while(!isspace(c)&&~c) s+=c,c=getchar();}inline void write(string s){for(int i=0,len=s.size();i<len;i++) putchar(s[i]);}template<typename T>inline void write(T*x){while(*x) putchar(*(x++));}template<typename T,typename...T2> inline void read(T&x,T2&...y){read(x),read(y...);}template<typename T,typename...T2> inline void write(const T x,const T2...y){write(x),putchar(' '),write(y...),sizeof...(y)==1?putchar('\n'):0;}
}using namespace IO;
const int maxn=1010,maxm=200010;
int n,m,c[maxn],bh[maxn][maxn];
vector<int>e[maxn];
struct EDGE{int u,v;
}b[maxm];
bool flag[maxn],to[maxn][maxn],nd[maxm];
void dfs1(int u,int st){if(to[st][u]) return ;to[st][u]=1;for(auto v :e[u]) dfs1(v,st);
}
void dfs2(int u,int col){if(flag[u]) return ;flag[u]=1,c[u]=col;for(auto v:e[u]) dfs2(v,col);
}
void dfs3(int u,int col,int st){if(flag[u]) return ;flag[u]=1;if(bh[st][u]&&c[u]!=col) nd[bh[st][u]]=1;for(auto v:e[u]) dfs3(v,col,st);
}
signed main(){read(n,m);for(int i=1;i<=m;i++){int u,v;read(u,v);bh[u][v]=i;e[u].push_back(v);b[i]={u,v};}for(int i=1;i<=n;i++) dfs1(i,i);for(int i=1;i<=n;i++){memset(c,0,sizeof(c)),memset(flag,0,sizeof(flag));flag[i]=1;int col=0;for(auto v:e[i]) col++,dfs2(v,col);memset(flag,0,sizeof(flag));flag[i]=1;for(int j=e[i].size()-1;j>=0;j--){dfs3(e[i][j],col,i);col--;}}for(int i=1;i<=m;i++) if(nd[i]^to[b[i].v][b[i].u]) write("diff\n");else write("same\n");return 0;
}
http://www.jsqmd.com/news/444440/

相关文章:

  • Logstash
  • 均值不等式初步介绍
  • 最小二乘问题详解13:对极几何中本质矩阵求解
  • 2026年西宁漏水检测维修标杆机构最新推荐:消防管道漏水检测、卫生间漏水检测、厨房漏水检测、暗管漏水检测、地埋管线查漏水、厂房漏水检测、西宁斌瑶精准定位破解漏水难题 - 海棠依旧大
  • 2026年8款主流降AI工具横评:亲测避坑,谁才是论文降重刚需首选? - 晨晨_分享AI
  • 无人机战场侦察 6 类军事目标检测数据集(10,000张图片已划分、已标注)| AI训练适用于目标检测任务
  • getit
  • 2026年3月西宁漏水检测维修机构选择指南:漏水检测、查漏水、防水维修、厨房漏水、厂房漏水、地埋管线、漏水点定位机构 - 海棠依旧大
  • 2026年8款主流降AI工具横评:亲测避坑,谁才是论文降重刚需首选? - 老米_专讲AIGC率
  • 著名的独立开发者 Clara 为什么还是选择了成立团队,以及一些经验
  • 省选 2026 知识点梳理
  • 论文AI率降低实用指南:热门工具横评与实战方案 - 仙仙学姐测评
  • Energy Distance:度量两个多元分布差异的统计方法
  • 论文AI率过高怎么办?实用降AI工具横评与高效应对指南 - 晨晨_分享AI
  • 论文AI率怎么降?2026年实用工具与方法全指南 - 仙仙学姐测评
  • 封神级训诂入门|方一新《训诂学概论》,读懂古籍的钥匙就在这本能
  • 论文AI率降低实用指南:热门工具横评与实战方案 - 晨晨_分享AI
  • 2026年北京婚姻律师推荐:海淀/朝阳/昌平三区资深团队测评,从专业度到服务体验的选型指南 - 小白条111
  • QGraphicsObject学习
  • 深入解析:决策树三大核心算法详解:ID3、C4.5与CART
  • 2026年北京遗产继承律师推荐:从专业度到服务体验的深度测评 - 小白条111
  • Redis深度避坑:从命令陷阱到主从复制的生产级实战指南
  • 岐金兰AI元人文的思想史意义再定位
  • 软件研发 --- 学Python
  • AI能对.NET项目开发起到哪些作用
  • 【音乐播放器推荐】Dopamine官方下载:全格式支持,本地听歌神器(附资源包) - xiema
  • 2026年北京房产继承律师推荐测评:从专业度到服务体验的5大核心维度解析 - 小白条111
  • 2026年北京海淀/朝阳/昌平离婚律师推荐:从专业能力到服务体验的深度测评 - 小白条111
  • LNP 脂质纳米颗粒递送系统:原理、结构与生物医药前沿应用
  • 完整教程:Moltbot高权限架构与“最小权限”安全原则的深度冲突剖析