博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最少加多少边成为强连通图
阅读量:6156 次
发布时间:2019-06-21

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

#include 
#include
#include
#include
#include
#include
#include
#include
using namespace std; typedef long long LL; typedef unsigned long long ULL; const int MAXN(100010); const int MAXE(100010); template
bool checkmin(T &a, const T &b){ return b < a? (a = b, true): false; } template
bool checkmax(T &a, const T &b){ return b > a? (a = b, true): false; } inline int lowb(int i){ return i&-i;} int gcd(int a, int b){ while(b){ int t = a%b; a = b; b = t; } return a; } struct E{ int u, v; E *next; }; struct G{ E *h[MAXN]; E e[MAXE], *r; void init(int n){ memset(h, 0, sizeof(h[0])*(n+1)); r = e; } void add(int u, int v){ r->u = u; r->v = v; r->next = h[u]; h[u] = r++; } } g, g1, g2, g3; stack
st; int co[MAXN], rep[MAXN], to[MAXN], ind[MAXN], out[MAXN], cn; bool vis[MAXN]; void dfs(int u){ vis[u] = true; for(E *i = g.h[u]; i; i = i->next) if(!vis[i->v]) dfs(i->v); st.push(u); } void dfs1(int u){ co[u] = cn; for(E *i = g1.h[u]; i; i = i->next) if(!co[i->v]) dfs1(i->v); } void dfs2(int u, int rt){ vis[u] = true; bool leaf(true); for(E *i = g2.h[u]; i; i = i->next){ leaf = false; if(!vis[i->v]) dfs2(i->v, rt); } if(leaf) to[u] = rt; } int main(){ int n, u; scanf("%d", &n); g.init(n); g1.init(n); for(int i = 1; i <= n; ++i){ scanf("%d", &u); g.add(i, u); g1.add(u, i); } for(int i = 1; i <= n; ++i) if(!vis[i]) dfs(i); while(!st.empty()){ u = st.top(); st.pop(); if(co[u]) continue; co[u] = ++cn; rep[cn] = u; dfs1(u); } if(cn == 1){ printf("0\n"); return 0; } g2.init(cn); memset(ind, 0, sizeof(ind[0])*(cn+1)); for(E *i = g.e; i < g.r; ++i) if(co[i->u] != co[i->v]){ g2.add(co[i->v], co[i->u]); ++out[co[i->u]]; ++ind[co[i->v]]; } memset(vis, 0, sizeof(vis[0])*(cn+1)); for(int i = 1; i <= cn; ++i) if(out[i] == 0) dfs2(i, i); int ans = 0, f = 0; for(int i = 1; i <= cn; ++i) if(ind[i] == 0){ if(!f) f = i; ++ans; } printf("%d\n", ans); int l = f; for(int i = f+1; i <= cn; ++i) if(ind[i] == 0){ printf("%d %d\n", rep[to[l]], rep[i]); l = i; } printf("%d %d\n", rep[to[l]], rep[f]); return 0; }

 

转载于:https://www.cnblogs.com/jianrenfang/p/7497921.html

你可能感兴趣的文章
insert select带来的问题
查看>>
EasyUI 添加tab页(iframe方式)
查看>>
mysqldump主要参数探究
查看>>
好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题...
查看>>
使用addChildViewController手动控制UIViewController的切换
查看>>
Android Fragment应用实战
查看>>
SQL Server查询死锁并KILL
查看>>
内存或磁盘空间不足,Microsoft Office Excel 无法再次打开或保存任何文档。 [问题点数:20分,结帖人wenyang2004]...
查看>>
委托到Lambda的进化: ()=> {} 这个lambda表达式就是一个无参数的委托及具体方法的组合体。...
查看>>
apache 伪静态 .htaccess
查看>>
unity3d 截屏
查看>>
ASP.NET MVC学习之控制器篇
查看>>
MongoDB ServerStatus返回信息
查看>>
分析jQuery源码时记录的一点感悟
查看>>
android中的textview显示汉字不能自动换行的一个解决办法
查看>>
程序局部性原理感悟
查看>>
从 保龄球得分计算方法 浅析 深度学习
查看>>
leetcode 41. First Missing Positive
查看>>
优雅地在Mac+Valet环境下本地部署phphub
查看>>
开发之路(设计模式二:观察者模式)
查看>>