Connections Gym - 101630C DFS/有向图的强联通分量边集
2017-12-12 22:07
429 查看
题目链接
求有向图强连通分量的2n个边的边集 首先从1开始DFS可以走到的所有点,并记录走过的边 这样就满足了从1可达所有其他点 然后从1开始DFS走反向边,这样保证其他点可达1点. 两遍dfs
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e5+5; struct node { int to; int ind; }; int u[maxn]; int v[maxn]; int ans[maxn]; vector<node> G[maxn]; vector<node> G1[maxn]; int T; int n,m; int vis[maxn]; void dfs(int cur) { vis[cur]=1; for(int i=0;i<G[cur].size();i++) { if(vis[G[cur][i].to ]) continue; ans[ G[cur][i].ind ] = 1; dfs(G[cur][i].to ); } } void dfs1(int cur) { vis[cur]=1; for(int i=0;i<G1[cur].size();i++) { if(vis[G1[cur][i].to ]) continue; ans[ G1[cur][i].ind ] = 1; dfs1(G1[cur][i].to ); } } int main() { // freopen("data.txt","r",stdin); // ios_base::sync_with_stdio(false); // cin >> T; scanf("%d",&T); while(T--) { memset(ans,0,sizeof(ans)); memset(vis,0,sizeof(vis)); scanf("%d %d",&n,&m); for(int i=0;i<=n;i++) { G[i].clear(); } for(int i=0;i<=n;i++) { G1[i].clear(); } node nt; for(int i=1;i<=m;i++) { scanf("%d %d",&u[i],&v[i]); nt.to = v[i]; nt.ind = i; G[u[i]].push_back(nt); nt.to = u[i]; nt.ind = i; G1[v[i]].push_back(nt); } dfs(1); memset(vis,0,sizeof(vis)); dfs1(1); int ct = m-2*n; for(int i=1;i<=m&&ct;i++) { if(!ans[i]) { ct--; printf("%d %d\n",u[i],v[i]); } } } return 0; }
相关文章推荐
- [HAOI2006 受欢迎的牛] 强联通分量 缩点
- Redundant Paths+POJ+边双联通分量(有重边-奇偶判断法)
- Codeforce 505D - Mr. Kitayuta's Technology 弱联通分量+拓扑排序
- zoj 1119 SPF (tarjan求割点的联通分量数)
- Tarjan 算法求强联通分量
- 【POJ 3352】 Road Construction(边联通分量入门)
- 51nod1072 求解一个图里面的强联通分量
- HDU 2767 强联通分量
- HDU 2242 强联通分量+树形DP
- Uva 10765 Doves and bombs (点双联通分量 + Block Forest Data Structure)
- HDU 3394 Railway (点双联通分量+桥)
- 无向图强联通分量-洛谷 P2860 [USACO06JAN]冗余路径Redundant Paths
- 点双联通分量和边双联通分量小结
- 求解强联通分量 tarjan算法
- poj3177—Redundant Paths(缩点+边双联通分量)
- 强联通分量——学习笔记
- 强联通分量 缩点 tarjan 入门题小集
- HDU3836(强联通分量+思维)
- board (双联通分量)
- Tarjan算法 (强联通分量 割点 割边)