当前位置:网站首页>[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;
}
边栏推荐
- 无人艇轨迹跟踪的预设性能抗扰控制研究
- How to display an Excel table in the body of an email?
- R语言使用方差分析ANOVA比较回归模型的差异、anova函数比较两个模型并报告它们是否存在显著差异(两个模型的数据相同,一个模型使用的预测特征包含另外一个模型的特征)
- jsArray数组复制方法性能测试2207292307
- 58. 最后一个单词的长度
- 树形dp小总结(换根,基环树,杂七杂八的dp)
- Analysis of AI recognition technology and application scenarios of TSINGSEE intelligent video analysis gateway
- 【自校正控制】自校正PID
- [PostgreSQL] - 存储结构及缓存shared_buffers
- canvas彩虹桥动画js特效
猜你喜欢
随机推荐
leetcode207.课程表(判断有向图是否有环)
判断链表是否有环
666666
Current and voltage acquisition module DAM-6160
正确处理页面控制器woopagecontroller.php,当提交表单时是否跳转正确的页面
matlab画图,仅显示部分图例
jsArray数组复制方法性能测试2207292307
[Go]四、模块和包、流程控制、结构体
程序员修炼之道:务以己任,实则明心——通向务实的最高境界
【23考研】408代码题参考模板——顺序表
[PostgreSQL] - explain SQL analysis introduction
展厅全息投影所具备的三大应用特点
Using Baidu EasyDL to realize the recognition of the chef's hat of the bright kitchen
腰部外骨骼机器人线性自抗扰控制器参数优化
datax开启hana支持以及dolphinscheduler开启datax任务
canvas彩虹桥动画js特效
strlen跟sizeof区别
Go 事,Gopher 要学的数字类型,变量,常量,运算符 ,第2篇
Eleven BUUCTF questions (06)
如何将EasyCVR平台RTSP接入的设备数据迁移到EasyNVR中?









