首页 > 其他分享 >【Tarjan缩点】USACO5.3 校园网Network of Schools】

【Tarjan缩点】USACO5.3 校园网Network of Schools】

时间:2024-08-16 20:40:15浏览次数:9  
标签:缩点 __ Tarjan idx int head low 校园网 include

[P2746 USACO5.3] 校园网Network of Schools

大意:一个图 可能有环 a:求deg入度为0的点的个数 b:至少加多少条边让图所有点可以互相到达

思路:看代码

#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);
    //取max
    if(scc_cnt==1) ans=0;
    cout<<ans1<<"\n"<<ans;
    
    return 0;
}

标签:缩点,__,Tarjan,idx,int,head,low,校园网,include
From: https://www.cnblogs.com/Phrink734/p/18363590

相关文章

  • 强连通分量tarjan
    引言强连通分量本质上是处理一个有向有环图(如果在这样的图上搞事情可能会死循环)变成一个有向无环图强连通分量上的点可以互相到达所以针对一些问题(我也没搞明白究竟是哪种问题)例如:给你一张有向图,每个点都有一个点权(不是边权了哦),且每一个点都可以经过任意多次,但是点权只......
  • 【Tarjan SCC 加边使得所有图联通 至少选取多少个点能图联通 】Network of Schools加
    [P2812校园网络【USACO]NetworkofSchools加强版大意:1.图G=(V,E)选几个点可以到达所有的点2.连多少条边可以让任意一个点出发到达其他所有点1思路:1.Tarjan跑一遍求SCC那些出度为0的点就是出发的所有点即din0的点的数量2.计算dout0的点的数量和din0的点的数量取max......
  • 【模板】缩点
    \[\Large给出一个图,求出SCC后缩点得到新的图\]做法:Tarjan记录scc然后根据SCC去重新建图#include<cstdio>#include<stack>#include<algorithm>#include<iostream>#include<cstring>#include<vector>#include<queue>#defineepemplace_b......
  • Java计算机毕业设计基于Android的校园网上拍卖平台(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在数字化校园建设的浪潮中,学生们对于便捷、高效的二手商品交易需求日益增长。传统的校园跳蚤市场受限于时间、空间等因素,难以满足学生群体对于多样化......
  • Java计算机毕业设计基于Android的校园网上拍卖平台(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,特别是移动互联网的普及,校园生活也日益数字化、便捷化。在传统校园市场中,二手物品的交换与拍卖往往受限于时间、空间和信息......
  • 计算机毕业设计django+vue校园网络跳蚤市场系统的设计与应用【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的普及和校园生活的丰富多彩,学生们在日常学习和生活中积累了大量的二手物品,如书籍、电子产品、生活用品等。这些物品往往因为......
  • Tarjan 与连通性
    tarjan是一系列与图连通性相关的算法的统称,本文将总结常见的tarjan算法。并配合一定量的练习。无向图求割边割点割点:删掉后让整个图不联通的点。割边(桥):删掉后让整个图不联通的边。搜索树:对图进行dfs时经过的边的集合。容易发现其构成一棵树。搜索树上的边称为树边。时间......
  • Tarjan算法和连通性相关(三)
    上一篇博客我们介绍了割点和桥,本文我们继续学习与连通性有关的一些概念边双连通分量什么是边双连通分量?在一张连通的无向图中,对于两个点u和v,如果无论删去哪条边(只能删去一条)都不能使它们不连通,我们就说u和v边双连通,边双联通分量是极大的边双连通子图怎么求边双连通......
  • Tarjan算法和连通性相关(二)
    上一篇博客我们介绍了强连通分量,本文我们继续学习与连通性有关的一些概念割点什么是割点?对于一个无向图,如果把一个点删除后这个图的极大连通分量数增加了,那么这个点就是这个图的割点我们画个图理解一下:在这个图中,如果我们把3这个点给删除掉,那么这张图就会被拆分成两个部......
  • Tarjan算法与连通性相关(一)
    昨天在打牛客多校的时候遇到了一道与连通性有关的图论题,笔者一眼就看出这题考察的知识点是Tarjan算法,但是笔者上次写Tarjan算法还是三年前的事情(太惭愧了qaq),于是笔者和队友在赛时花了一个小时时间学习了Tarjan算法成功通过了此题,故写下这篇博客进一步加深印象,同时也是分享自己对于......