博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(国庆训练) NEERC2017 C. Connections
阅读量:5347 次
发布时间:2019-06-15

本文共 1306 字,大约阅读时间需要 4 分钟。

题目链接:

题意:给定一个强联通分量,m条边,n个点,需要删去m-2*n个边,使得图仍为强连通分量

题解:因强连通分量两点间任意可达,所以处理出,从1结点到各个节点所需要的边和从其他结点到达1结点所需要的边就好了

正着dfs和建反向图dfs即可找到2n-2条边,

百度题解的时候发现了这个,正反dfs求强连通分量,

#include
using namespace std;typedef pair
pii;int t,n,m;const int N=1e5+10;vector
g[N],g1[N];int vis[N];set
all;vector
vv;void dfs1(int u){ vis[u]=1; for(auto v:g[u]){ if(vis[v]) continue; vv.push_back({u,v}); dfs1(v); }}void dfs2(int u){ vis[u]=1; for(auto v:g1[u]){ if(vis[v]) continue; vv.push_back({v,u}); dfs2(v); }}int main(){ int x,y;scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); vv.clear();all.clear(); for(int i=1;i<=n;i++) g[i].clear(),g1[i].clear(),vis[i]=0; for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); g[x].push_back(y);all.insert({x,y}); g1[y].push_back(x); } dfs1(1); for(int i=1;i<=n;i++) vis[i]=0; dfs2(1); for(auto v:vv) all.erase(v); int num=m-2*n; for(auto v:all){ printf("%d %d\n",v.first,v.second); num--; if(num==0) break; } } return 0;}

 

转载于:https://www.cnblogs.com/vainglory/p/9757158.html

你可能感兴趣的文章
【练习】创建密码复杂度验证
查看>>
具有浏览器检测功能的登录页面模板
查看>>
Couchbase的bug引起的缓存服务器CPU占用高
查看>>
02 web应用程序
查看>>
Javascript 模块化理解
查看>>
贪吃蛇-设计文档
查看>>
Ajax全局加载框(Loading效果)的配置
查看>>
webpack配置之代码优化
查看>>
20165320 Java实验三:敏捷开发与XP实践
查看>>
Android Studio生成成员变量时自动加上m前缀
查看>>
Python 爬虫的工具列表 附Github代码下载链接
查看>>
时间正则判定
查看>>
关于Struts传递json给easyui的随笔
查看>>
设计模式学习(二):软件设计与模式【转】
查看>>
51,是的,没有休息
查看>>
堆内存
查看>>
JMeter学习笔记2-图形界面简单介绍
查看>>
delphi 单引号在字符串中使用方法
查看>>
ComponentOne 2016 V2发布了!
查看>>
新的尝试!ComponentOne WinForm 和 .NET Core 3.0
查看>>