Acwing 1175.最大联通子图(tarjan缩点求scc)

简介: 笔记

Acwing 1175.最大连通子图


题意


1.png


输入格式

第一行包含三个整数 N , M , X  。N,M 分别表示图 G 的点数与边数,X 的意义如上文所述;

接下来 M行,每行两个正整数 a,b ,表示一条有向边(a,b) 。

图中的每个点将编号为 1 到 N ,保证输入中同一个(a,b) 不会出现两次。


输出格式

应包含两行。

第一行包含一个整数 K KK ,第二行包含整数 C   m o d   X o


数据范围


2.png


思路


3.png


强连通分量必然是半连通


求解步骤:


先用tarjan算法求出强连通分量并缩点


建图 给边判重(给边判重的原因是 两个半连通子图不相同当且仅当两个子图有某些点不同 而当两个半连通子图只有边不同时,我们认为它们相等)


拓扑图上求最大半连通子图    ⟺    \iff⟺ 求最长无分叉链


求最长无分叉链    ⟺    \iff⟺ 拓扑图上的最长路(scc中点的数量为权重)


代码

// 题目给的 M 为 1e6 但是我们要建两个图 所以 设 M 为 2e6
const int N = 1e5 + 10, M = 2e6 + 10;
int n, m, mod;
int h[N],hs[N],e[M],ne[M],idx;
int low[N],dfn[N];
int scc,timestamp;
stack<int>stk;
bool in_stk[N];
int id[N],siz[N];
int f[N],g[N];
unordered_set<LL>S;
void add(int h[],int a,int b){
  e[idx] = b,ne[idx] = h[a],h[a] = idx++;
}
void tarjan(int u){
  dfn[u] = low[u] = ++timestamp;
  stk.push(u),in_stk[u] = true;
  for(int i = h[u];~i;i = ne[i]){
    int j = e[i];
    if(!dfn[j]){
      tarjan(j);
      low[u] = min(low[u],low[j]);
    }
    else if(in_stk[j]){
      low[u] = min(low[u],dfn[j]);
    }
  }
  if(dfn[u] == low[u]){
    int y = 0;
    ++scc;
    do{
      y = stk.top();
      stk.pop();
      in_stk[y] = false;
      siz[scc]++;
      id[y] = scc;
    }while(y != u);
  }
}
void solve() {
  scanf("%d%d%d",&n,&m,&mod);
  memset(h,-1,sizeof h);
  memset(hs,-1,sizeof hs);
  while(m--){
    int a,b;scanf("%d%d",&a,&b);
    add(h,a,b);
  }
  for(int i = 1;i <= n;++i){
    if(!dfn[i])
      tarjan(i);
  }
  for(int i = 1; i <= n;++i){ // 对scc建图
    for(int j = h[i];~j;j = ne[j]){
      int k = e[j];
      int a = id[i], b = id[k];
      LL hash = a * 1000000ll + b;
      if(a != b && !S.count(hash)){
        add(hs,a,b);
        S.insert(hash);
      }
    }
  }
  for(int i = scc;i;--i){ // scc递减的顺序为 拓扑序
    if(!f[i]){
      f[i] = siz[i];
      g[i] = 1;
    }
    for(int j = hs[i];~j;j = ne[j]){
      int k = e[j];
      if(f[k] < f[i] + siz[k]){
        f[k] = f[i] + siz[k];
        g[k] = g[i];
      }
      else if(f[k] == f[i] + siz[k]){
        g[k] = (g[k] + g[i]) % mod;
      }
    }
  }
  LL sum = 0,maxn = 0;
  for(int i = 1; i <= scc;++i){
    if(f[i] > maxn){
      maxn = f[i];
      sum = g[i];
    }
    else if(f[i] == maxn){
      sum = (sum + g[i]) % mod;
    }
  }
  printf("%lld\n",maxn);
  printf("%lld\n",sum);
}
signed main() {
    //int _; cin >> _;
    //while (_--)
        solve();
    return 0;
}



目录
相关文章
|
存储
【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?
【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?
10872 1
【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?
|
存储 分布式计算 负载均衡
【大数据技术Hadoop+Spark】MapReduce概要、思想、编程模型组件、工作原理详解(超详细)
【大数据技术Hadoop+Spark】MapReduce概要、思想、编程模型组件、工作原理详解(超详细)
1895 0
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
38_多模态模型:CLIP的视觉-语言对齐_深度解析
想象一下,当你看到一张小狗在草地上奔跑的图片时,你的大脑立刻就能将视觉信息与"小狗"、"草地"、"奔跑"等概念联系起来。这种跨模态的理解能力对于人类来说似乎是理所当然的,但对于人工智能系统而言,实现这种能力却经历了长期的技术挑战。多模态学习的出现,标志着AI从单一模态处理向更接近人类认知方式的综合信息处理迈出了关键一步。
1128 0
|
机器学习/深度学习 人工智能 算法
【机器学习】RLHF:在线方法与离线算法在大模型语言模型校准中的博弈
【机器学习】RLHF:在线方法与离线算法在大模型语言模型校准中的博弈
848 6
|
机器学习/深度学习 数据可视化 算法框架/工具
Python小项目:利用U-net完成细胞图像分割
这个项目能够锻炼你的深度学习技能,同时也能在医学、生物等领域有实际应用。你可以参考相关的教程和资源,如 GitHub 上的 U-Net 项目,以获得更详细的指导。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
311 3
|
算法
简单的KMP的next、nextval数组求解办法(存档自己用来复习)
简单的KMP的next、nextval数组求解办法(存档自己用来复习)
1593 2
|
机器学习/深度学习 自然语言处理 负载均衡
揭秘混合专家(MoE)模型的神秘面纱:算法、系统和应用三大视角全面解析,带你领略深度学习领域的前沿技术!
【8月更文挑战第19天】在深度学习领域,混合专家(Mixture of Experts, MoE)模型通过整合多个小型专家网络的输出以实现高性能。从算法视角,MoE利用门控网络分配输入至专家网络,并通过组合机制集成输出。系统视角下,MoE需考虑并行化、通信开销及负载均衡等优化策略。在应用层面,MoE已成功应用于Google的BERT模型、Facebook的推荐系统及Microsoft的语音识别系统等多个场景。这是一种强有力的工具,能够解决复杂问题并提升效率。
1370 2
|
调度 C语言
深入浅出:C语言线程以及线程锁
线程锁的基本思想是,只有一个线程能持有锁,其他试图获取锁的线程将被阻塞,直到锁被释放。这样,锁就确保了在任何时刻,只有一个线程能够访问临界区(即需要保护的代码段或数据),从而保证了数据的完整性和一致性。 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含一个或多个线程,而每个线程都有自己的指令指针和寄存器状态,它们共享进程的资源,如内存空间、文件句柄和网络连接等。 线程锁的概念
922 1
|
数据安全/隐私保护
remote: 认证失败,请确认您输入了正确的账号密码。 fatal: Authentication failed
、remote: 认证失败,请确认您输入了正确的账号密码。 fatal: Authentication failed
|
JavaScript
vue运行报错:SyntaxError: Cannot use import statement outside a module
vue运行报错:SyntaxError: Cannot use import statement outside a module
505 0
下一篇
开通oss服务