首页 > 其他分享 >【Tarjan SCC 加边使得所有图联通 至少选取多少个点能图联通 】Network of Schools加强版.md

【Tarjan SCC 加边使得所有图联通 至少选取多少个点能图联通 】Network of Schools加强版.md

时间:2024-08-10 23:17:26浏览次数:13  
标签:__ md Tarjan 联通 int head scc low include

[P2812 校园网络【USACO]Network of Schools加强版

大意:1.图G=(V,E)选几个点可以到达所有的点 2.连多少条边可以让任意一个点出发到达其他所有点1

思路:1.Tarjan 跑一遍求SCC 那些出度为0的点就是出发的所有点 即din0的点的数量 2.计算dout0的点的数量 和din0的点的数量取max 因为把那些din0或者dout0的scc点连接起来就能让所有图联通 ,特判一下 如果dout0的数量为1, 说明这个图只有一个scc 那么这个图就是联通的,不需要加边,输出0

#include <cstdio>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#define ep emplace_back 

#define lld long long 
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0); 
#define vec vector 
const int N = 2e5+9;
const int INF = 0x7FFFFFFF; //2147483647

const int inf1 = 0x3f3f3f3f; //1061109567
const int inf2 = 0x7f7f7f7f; //2139062143 memset赋值用

using namespace std;
int head[N],idx=0;
int head__[N],idx__;
bool vis[N];
struct node{
    int to,val,next;
};
node e[N],ee[N];
int din[N],dout[N];
int n,m,time__=0;
int low[N],dfn[N];
int scc[N],scc_cnt=0;
stack<int>st;
void add(int u,int v,int val){
    e[idx] = {v,val,head[u]};
    head[u] = idx++;
}
void add__(int u,int v,int val){
    ee[idx__] = {v,val,head__[u]};
    head__[u] = idx__++;
} 

void bd(){
    cin>>n;
    memset(head,-1,sizeof(head));
    for(int i=1 ; i<=n ; ++i){
        int x;
        cin>>x;
        while(x!=0){
            add(i,x,0);
            cin>>x;
        }
    }
}
void tarjan(int u){
    dfn[u] = low[u] = ++time__;
    st.push(u);
    vis[u] = 1;
    for(int i=head[u] ; i!=-1 ; i=e[i].next){
        int v = e[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]){
        ++scc_cnt;
        while(1){
            int v = st.top();
            st.pop();
            vis[v] = false;
            scc[v] = scc_cnt;
            if(v==u) break;
        }
    }
}
void bd__(){
    for(int i=1 ; i<=n ; ++i){
        for(int u = head[i] ; u!=-1 ; u=e[u].next){
            int v = e[u].to;
            int scc_u = scc[i];  // 获取节点 i 的 SCC 编号
            int scc_v = scc[v];  // 获取节点 v 的 SCC 编号
            if(scc_u != scc_v){
                add__(scc_u,scc_v,0);  // 在新图中添加边
                din[scc_v]++;
                dout[scc_u]++;
            }
        }
    }
}
void debug(){
    for(int i=1 ; i<=n ; ++i){
        //printf("%d\n",scc[i]);
    }
}
int main(){
    ios;
    bd();
    for(int i=1 ; i<=n ; ++i)
        if(!dfn[i]) tarjan(i);
    bd__();
    //debug();

    
    int ans1=0,ans2=0;
    for(int i=1 ; i<=scc_cnt ; ++i){
        //printf("din==%d dout==%d\n",din[i],dout[i]);
        if(din[i]==0)  ans1++;
        if(dout[i]==0) ans2++;
    }
    int ans = max(ans1,ans2);
    if(scc_cnt==1) ans=0;
    cout<<ans1<<"\n"<<ans;
    
    return 0;
}

标签:__,md,Tarjan,联通,int,head,scc,low,include
From: https://www.cnblogs.com/Phrink734/p/18352931

相关文章

  • 遇到《生化危机2重制版》 amd_ags_x64.dll 错误?别急!简单几步恢复游戏运行
    《生化危机2重制版》(ResidentEvil2Remake)是一款备受玩家喜爱的游戏,但有些玩家在尝试启动游戏时可能会遇到“缺少amd_ags_x64.dll”这样的错误提示。这通常意味着您的计算机上缺少某个必要的动态链接库文件(DLL),或者该文件已损坏。本文将解释这一问题的原因,并提供几种可能的解......
  • 使用WIN7 CMD 时出现了“The system cannot write to the specified device”
    使用WIN7CMD时出现了“Thesystemcannotwritetothespecifieddevice”(1)输入chcp可以查看cmd的编码(2)常见编码编号:65001:utf-820936:GB2312936:GBK437:美国英语(3)修改cmd的编码:chcpXXXX(编码编号) 1、右键点击Bat批处理,选择编辑,然后打开,重新另存为编码选择ANSI......
  • 联通云数据中心,云数据中心的全球引领力
    中国联通国际公司产品:联通云数据中心服务——将军澳智·云数据中心的全球引领力在数字化转型的浪潮中,数据中心作为信息时代的“心脏”,其重要性不言而喻。中国联通国际公司,凭借其前瞻性的战略眼光和深厚的行业积淀,于香港将军澳工业园区精心打造了联通云数据中心服务的旗舰之作—......
  • 中国联通国际公司产品:IP Transit
    中国联通国际公司产品:IPTransit引言随着全球化的加速发展以及互联网技术的不断进步,企业和组织对于稳定、高效且具有成本效益的国际互联网连接的需求日益增长。中国联通国际有限公司(以下简称“中国联通国际公司”),作为中国联通集团的海外业务拓展平台,致力于为企业提供多样化的通......
  • 联通云数据中心优势
    中国联通国际公司产品:联通云数据中心服务引言在全球数字经济快速发展的背景下,数据中心作为关键的信息基础设施,承担着数据存储、处理和交换的重要职能。中国联通国际公司积极响应市场需求,推出了一系列高质量的数据中心服务,其中,位于香港将军澳的智·云数据中心以其卓越的性能和......
  • 联通IP Transit产品
    中国联通国际公司产品:IPTransit——引领全球互联网穿透新纪元在数字化浪潮席卷全球的今天,高速、稳定、安全的网络连接已成为企业拓展国际市场的基石。中国联通国际公司,作为国际通信领域的佼佼者,凭借其深厚的行业积累与前瞻性的技术布局,隆重推出IPTransit产品,以BGP(边界网关协......
  • System has not been booted with systemd as init system (PID 1). Can't operate on
    昨天为了安装mariadb,不小心可能安装了sysinit的东西,在启动gogs服务时报了这个错'Systemhasnotbeenbootedwithsystemdasinitsystem(PID1).Can'toperate'找到了解决方案:我的理解是这样的linux系统大致有两种管理服务的方式,一种是sysinit一种是systemctl ......
  • bat cmd javaw -jar
    rem使用者应根据自身平台编码自行转换防止乱码例如win使用gbk编码@echooffchcp65001remjar平级目录setAppName=medicare-down.jarsetpathx=%CD%setpathxx=%pathx%\Java\jdk1.8.0_101\::echo%pathxx%set"JAVA_HOME=%pathxx%::set"CLASSPATH=%JAVA_HOME%\lib\dt.jar;......
  • vimdiff使用
    源程序文件(通常是纯文本文件)比较和合并工具一直是软件开发过程中比较重要的组成部分。现在市场上很多功能很强大的专用比较和合并工具,比如BeyondCompare;很多IDE或者软件配置管理系统,比如Eclipse,RationalClearCase都提供了内建的功能来支持文件的比较和合并。当远程工作在Uni......
  • 解决Windows系统下cmd中ping命令无法使用的问题
    问题描述:当我配置Java环境变量后,发现ping命令无法使用。 问题分析:可能是环境变量配置上出了问题,还可能是PING.EXE被删除了。解决步骤:①“Win+R”打开运行窗口,输入:C:\Windows\System32 ②点击“确定”后,看是否能够找到PING.EXE(文件名顺序一般按字母顺序)。如果没......