HDU 4635 Strongly connected(经典强连通思维)
发布日期:2021-06-30 10:24:07
浏览次数:2
分类:技术文章
本文共 2006 字,大约阅读时间需要 6 分钟。
加了一些边后,一定分成了若干个连通分量
如果有大于两个连通分量,那么连通分量间还可以继续加边,不符合
那么记第一个连通分量是 x x x部,第二个是 y y y部
不可能同时存在 x x x到 y y y的边和 y y y到 x x x的边
这样会把两个连通分量合并成一个
所以两个连通分量内部都是完全图,且 x x x部所有点连向 y y y(反过来也没关系)
边数为 a n s = x ∗ ( x − 1 ) + y ∗ ( y − 1 ) + x y ans=x*(x-1)+y*(y-1)+xy ans=x∗(x−1)+y∗(y−1)+xy
a n s = x 2 + y 2 − x − y + x y ans=x^2+y^2-x-y+xy ans=x2+y2−x−y+xy
a n s = ( x + y ) 2 − ( x + y ) − x y ans=(x+y)^2-(x+y)-xy ans=(x+y)2−(x+y)−xy
由于 x + y = n x+y=n x+y=n,那么 a n s = n 2 − n − x y ans=n^2-n-xy ans=n2−n−xy
所以 x x x和 y y y差值最大时, a n s ans ans最大
x x x部最小的话,那就是一个入度为零或出度为零的点
且内部节点最小,那么就缩点去找就好了~
#includeusing namespace std;const int maxn = 4e5+10;#define int long longstruct edge{ int u,to,nxt;}d[maxn]; int head[maxn],cnt=1;void add(int u,int v){ d[++cnt] = (edge){ u,v,head[u]},head[u] = cnt;}int low[maxn],dfn[maxn],stac[maxn],vis[maxn],top,id,bccn;int out[maxn],in[maxn],bcc[maxn],point[maxn],n,m;void tarjan(int u){ dfn[u] = low[u] = ++id, stac[++top] = u, vis[u] = 1; for(int i=head[u];i;i=d[i].nxt ) { int v = d[i].to; if( !dfn[v] ) { tarjan(v); low[u] = min( low[u],low[v] ); } else if( vis[v] ) low[u] = min( low[u],dfn[v] ); } if( low[u]==dfn[u] ) { int temp; bccn++; while( temp=stac[top--] ) { bcc[temp] = bccn; vis[temp] = 0; point[bccn]++; if( temp==u ) break; } }}signed main(){ int t,casenum=0; cin >> t; while( t-- ) { cin >> n >> m; for(int i=1;i<=m;i++) { int l,r; scanf("%lld%lld",&l,&r); add(l,r); } for(int i=1;i<=n;i++) if( !dfn[i] ) tarjan(i); for(int i=2;i<=cnt;i++) { int u = d[i].u, v = d[i].to; if( bcc[u]!=bcc[v] ) out[bcc[u]]++,in[bcc[v]]++; } int minn = 1e9; for(int i=1;i<=bccn;i++) if( in[i]==0||out[i]==0 ) minn = min( minn,point[i] ); cout << "Case " << ++casenum << ": "; if( bccn==1 ) cout << -1 << endl; else cout << n*n-n-minn*(n-minn)-m << endl; bccn = id = top = 0; cnt = 1; for(int i=1;i<=n;i++) point[i] = bcc[i] = in[i] = low[i] = dfn[i] = head[i] = out[i] = 0; }}
转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/109677069 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年05月01日 05时24分49秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JavaScript DOM对象操作详解
2019-04-30
JavaScript 表单操作与MD5加密
2019-04-30
大数据技术之Hadoop(入门)概述、运行环境搭建、运行模式
2019-04-30
CppWeekly 06 structured binding
2019-04-30
CppWeekly 08 constexpr
2019-04-30
使gazebo_ros能够找到其他package的资源文件
2019-04-30
右键打开 visual studio developer command prompt
2019-04-30
利用AirSim在Unreal Engine上获取全景图像
2019-04-30
神奇的c++等号重载
2019-04-30
利用uWSGI和Nginx部署Django
2019-04-30
Linux下修改^M换行符
2019-04-30
笔记-有关于Vim
2019-04-30
vnc, vncserver, ssh的locale问题
2019-04-30
[野路数] Django中使用logging
2019-04-30
[未修订]ROS学习笔记
2019-04-30
Eigen学习笔记
2019-04-30
PyTorch的学习笔记01-基础中的基础
2019-04-30
onshape 做参考面等虚拟几何的装配和原点定位
2019-04-30