cf999E (强联通分量模板题)
2024-09-06 19:38:19
给出n个点m条边的有向图,问至少添加多少条边使得任何点都可以从s点出发可达
#include<bits/stdc++.h>
#define forn(i, n) for (int i = 0 ; i < int(n) ; i++)
#define fore(i, s, t) for (int i = s ; i < (int)t ; i++)
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pf2(x,y) printf("%d %d\n",x,y)
#define pf(x) printf("%d\n",x)
#define each(x) for(auto it:x) cout<<it<<endl;
#define pi pair<int,int>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const int maxm=2e5+5;
const int inf=1e9;
int head[maxn],ver[maxm],nex[maxm],tot;
void inline AddEdge(int x,int y){
ver[++tot]=y,nex[tot]=head[x],head[x]=tot;
}
int dfn[maxn],low[maxn],num,sccnum,scc[maxn],s[maxn],d[maxn],top;
void Tarjan(int x){
low[x]=dfn[x]=++num;
s[++top]=x;
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
if(!dfn[y]) {
Tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(!scc[y]) low[x]=min(low[x],dfn[y]);//说明找到了一条反祖边
}
if(low[x]==dfn[x]) {
sccnum++;
while(s[top]!=x) {
scc[s[top]]=sccnum;
top--;
}
scc[s[top]]=sccnum;
top--;
}
}
int main(){
int n,m,s;
cin>>n>>m>>s;
for(int i=0;i<m;i++){
int x,y;
scanf("%d%d",&x,&y);
AddEdge(x,y);
}
for(int i=1;i<=n;i++)
if(!dfn[i]) Tarjan(i);
for(int x=1;x<=n;x++){
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
if(scc[x]!=scc[y]){
d[scc[y]]++;
}
}
}
int ans=0;
for(int i=1;i<=sccnum;i++)
if(!d[i] && i!=scc[s]) ans++;
cout<<ans<<endl;
}
最新文章
- Content-Type: application/vnd.ms-excel";>;
- 20160908_Redis主从复制Replication
- MySql与SqlServer的一些常用用法的差别
- SQL Server安装【转载】
- LINUX 笔记-VIM常用命令整理
- EBS值集,弹性域常用表
- Cocos2D遍历场景图(Scene Graph)
- java项目发布到linux服务器,tomcat正常启动但没加载项目
- echo 与 printf的区别与联系
- 20172306 2018-2019-2 《Java程序设计与数据结构》第七周学习总结
- sqoop导出到hdfs
- 洛谷P1219 :八皇后(DFS+回溯)
- blob 对象 实现分片上传 及 显示进度条
- SpringBatch Sample (五)(复合格式文件的读、多文件的写)
- CMSZU站群管理系统 升级到 v1.8 [源码下载]
- Java编程的逻辑 (7) - 如何从乱码中恢复 (下)?
- oracel SQL多表查询优化
- Eclipse打开时“发现了以元素&#39;d:skin&#39;”开头的无效内容。此处不应含有子元素的解决方法
- hdu 1907(Nim博弈)
- mysql数据库目录存放位置更改