正题

题目链接:https://www.luogu.com.cn/problem/AT3945


题目大意

\(n\)个点\(m\)条边的一张图,对于每条边求它翻转后强连通分量数量是否变化。

\(1\leq n\leq 1000,1\leq m\leq 2\times 10^5\)


解题思路

对于一条\((x,y)\)的边。

  • 如果原来\(y\)能走到\(x\),那么考虑现在是否强连通分量是否减少,就是说如果存在一条\(x->y\)的路径不经过这条边那么不变,否则减少。
  • 如果原来\(y\)不能走到\(x\),那么考虑现在强连通分量是否增加,那么如果存在一条\(x->y\)的路径不经过这条边那么就会产生一个新的强连通分量。

考虑每一个\(x\)能否走到\(y\),这个直接暴力\(O(nm)\)预处理就好了。

然后考虑对于每条边\(x,y\),\(x\)能否不经过这条边走到\(y\),从\(x\)开始\(dfs\),记录出去的第一条边,然后如果到一个点有两种不同情况那么标记即可。

时间复杂度\(O(nm)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e3+10,M=2e5+10;
int n,m,f[N][N],g[N][N],X[M],Y[M];
vector<int> a[N];
void step(int x,int *v){
if(v[x])return;v[x]=1;
for(int i=0;i<a[x].size();i++)
step(a[x][i],v);
}
void calc(int x,int *v){
if(v[x]==1)return;v[x]=1;
for(int i=0;i<a[x].size();i++)
calc(a[x][i],v);
return;
}
void dfs(int x,int *v,int pos){
if(v[x]>0)return;
else if(v[x]<0){
if((-v[x])==pos)return;
else v[x]=1;
}
else if(!v[x])v[x]=-pos;
for(int i=0;i<a[x].size();i++)
if(v[x]==1)calc(a[x][i],v);
else dfs(a[x][i],v,pos);
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
a[x].push_back(y);X[i]=x;Y[i]=y;
}
for(int i=1;i<=n;i++)step(i,f[i]);
for(int x=1;x<=n;x++){
g[x][x]=1;
for(int i=0;i<a[x].size();i++)
dfs(a[x][i],g[x],i+1);
}
for(int i=1;i<=m;i++){
if(f[Y[i]][X[i]]){
if(g[X[i]][Y[i]]==1)puts("same");
else puts("diff");
}
else{
if(g[X[i]][Y[i]]==1)puts("diff");
else puts("same");
}
}
return 0;
}

最新文章

  1. 关于一些对map和整行读取文件操作
  2. Win10 UI入门 RenderTransform属性分析之Translate 平移变形
  3. mac pro常用操作
  4. Asp.Net MVC中使用ACE模板之Jqgrid
  5. HDU 1171 背包
  6. Android网络编程基础
  7. ubuntu eclipse下配置C++ 环境
  8. vs2008团队资源管理器安装步骤
  9. oracle两种导出导入方式,即imp与impdp之比较
  10. Powerpoin怎么制作电子相册|PPT制作电子相册教程
  11. ETHERNET帧结构
  12. ArrayList去除重复元素(包括字符串和自定义对象)
  13. 初探Parcel
  14. Dynamics 365新引入了多选选项集类型字段
  15. Scrapy实战篇(八)之爬取教育部高校名单抓取和分析
  16. ASP.NET Core 如何在运行Docker容器时指定容器外部端口(docker compose)
  17. 使用laravel搭建CURD后台页面
  18. MicrosoftSQLServer数据库定时备份(备份计划)的几种方式
  19. python安装包提示error: option --single-version-externally-managed not recognized
  20. bzoj 1209

热门文章

  1. ASP.NET Core教程:ASP.NET Core中使用Redis缓存
  2. Windows 10 - View SIM Card Number
  3. WPF 附件路由事件
  4. 【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)
  5. 集合的打印、列表List、迭代器Iterators
  6. C语言格式化输出语句
  7. return 和 return false 的区别
  8. JavaWeb之JavaMail
  9. 使用 antd 的 form 组件来自定义提交的数据格式
  10. Excel 快速跳转到工作表