当前位置:网站首页>[ARC092D] Two Faced Edges
[ARC092D] Two Faced Edges
2022-07-30 13:17:00 【心怀凉月】
[ARC092D] Two Faced Edges
考虑强联通分量的本质,即其中任意两点 u , v u,v u,v 都有一条 u → v u\to v u→v 的路径,同时也有一条 v → u v\to u v→u 的路径。
考虑转边强联通分量个数改变的情况,设有向边为 ( u , v ) (u,v) (u,v):
- 有一条反向边 ( v , u ) (v,u) (v,u) 且除了 ( u , v ) (u,v) (u,v) 外无一条从 u u u 到 v v v 的路径,强联通分量个数减少。
- 无反向边 ( v , u ) (v,u) (v,u) 且除了 ( u , v ) (u,v) (u,v) 外有一条从 u u u 到 v v v 的路径,强联通分量个数增加。
个数不改变的情况即为:
- 有一条反向边 ( v , u ) (v,u) (v,u) 且除了 ( u , v ) (u,v) (u,v) 外有一条从 u u u 到 v v v 的路径,强联通分量个数减少。
- 无一条反向边 ( v , u ) (v,u) (v,u) 且除了 ( u , v ) (u,v) (u,v)无一条从 u u u 到 v v v 的路径,强联通分量个数减少。
总结一下,就是考虑以下几个因素:
- 当前边是否有反向边,维护方法比较简单。
- 除当前边外是否有一条从 u u u 到 v v v 的路径,考虑染色判断,方法不讲。
时间复杂度 O ( n m ) \mathcal O(nm) O(nm),可优化。
#include<bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
#define ha putchar(' ')
#define he putchar('\n')
inline int read()
{
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
x = x * 10 + c - '0', c = getchar();
return x * f;
}
inline void write(int x)
{
if(x < 0)
{
putchar('-');
x = -x;
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
const int _ = 1010, M = 2e5 + 10;
int n, m, rt, u[M], v[M], flg[_];
bool f1[_][_], f2[_][_];
bitset<_> vis;
vector<int> d[_];
void dfs1(int u)
{
vis.set(u);
f1[rt][u] = 1;
for(int v : d[u])
if(!vis[v]) dfs1(v);
}
void dfs2(int u, int cxr, bool t)
{
if(t) flg[u] = cxr;
else f2[rt][u] = (flg[u] != cxr);
vis.set(u);
for(int v : d[u])
if(!vis[v]) dfs2(v, cxr, t);
}
signed main()
{
n = read(), m = read();
for(int i = 1; i <= m; ++i)
{
u[i] = read(), v[i] = read();
d[u[i]].push_back(v[i]);
}
for(int i = 1; i <= n; ++i)
{
vis.reset();
rt = i;
dfs1(i);
}
for(int i = 1; i <= n; ++i)
{
vis.reset(), vis.set(i);
memset(flg, 0, sizeof flg);
int nw = d[i].size();
rt = i;
for(int j = 0; j < nw; ++j)
if(!vis[d[i][j]]) dfs2(d[i][j], j + 1, 1);
vis.reset(), vis.set(i);
for(int j = nw - 1; j >= 0; --j)
if(!vis[d[i][j]]) dfs2(d[i][j], j + 1, 0);
}
// for(int i = 1; i <= n; ++i)
// {
// for(int j = 1; j <= n; ++j) cout << f1[i][j] << " ";
// cout << "\n";
// }
// cout << "\n";
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j) cout << f2[i][j] << " ";
cout << "\n";
}
for(int i = 1; i <= m; ++i)
puts(f1[v[i]][u[i]] ^ f2[u[i]][v[i]] ? "diff" : "same");
return 0;
}
边栏推荐
- Anaconda\Scripts\pip-script.py is not present ? 解决方案
- 一本通循环结构的程序设计第一章题解(1)
- ES6 Set与Map是什么,如何使用
- 当下,产业园区发展面临的十大问题
- datax enables hana support and dolphinscheduler enables datax tasks
- These critical programs are missing or too old: ma
- dolphinscheduler添加hana支持
- Analysis of AI recognition technology and application scenarios of TSINGSEE intelligent video analysis gateway
- 外包干了七年,废了。。。
- 基于柔性人机接口的人机协调运动控制方法
猜你喜欢
随机推荐
“封号斗罗” 程序员修炼之道:通向务实的最高境界
缓存一致性
Mysql batch insert transaction unique key repeated processing
逻辑漏洞----权限类漏洞
R语言ggplot2可视化:使用ggpubr包的ggboxplot函数可视化分组箱图、使用ggpar函数改变图形化参数(xlab、ylab、改变可视化图像的坐标轴标签内容)
【23考研】408代码题参考模板——顺序表
【河北工业大学】考研初试复试资料分享
Hand tearing read-write lock performance test
每天学一点Scala之 伴生类和伴生对象
05 | 后台登录:基于账号密码的登录方式(下)
Raja Koduri澄清Arc GPU跳票传闻 AXG年底前新推四条产品线
自从外包干了四年,基本废了...
ML之PDP:基于FIFA 2018 Statistics(2018年俄罗斯世界杯足球赛)球队比赛之星分类预测数据集利用DT决策树&RF随机森林+PDP部分依赖图可视化实现模型可解释性之详细攻略
RTSP/Onvif协议视频平台EasyNVR服务一键升级功能的使用教程
【微信小程序】一文带你搞懂小程序的页面配置和网络数据请求
What are the hard-core upgrades and applications that cannot be missed in Greenplum 6.0?
666666
戴墨镜的卡通太阳SVG动画js特效
58. 最后一个单词的长度
jsArray数组复制方法性能测试2207292307