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;
}



目录
相关文章
|
文字识别 算法 计算机视觉
关键帧提取 | 学习笔记
快速学习关键帧提取,介绍了关键帧提取系统机制, 以及在实际应用过程中如何使用。
关键帧提取 | 学习笔记
|
机器学习/深度学习 数据采集 人工智能
阿里巴巴首次揭秘电商知识图谱AliCoCo!淘宝搜索原来这样玩!
电商技术进入认知智能时代,将给亿万用户带来更加智能的购物体验。经过两年的探索与实践,阿里巴巴的电商认知图谱 AliCoCo 已成体系规模,并在搜索推荐等电商核心业务场景上取得佳绩,关于 AliCoCo 的文章《AliCoCo: Alibaba E-commerce Cognitive Concept Net》也已被国际顶会 SIGMOD 接收,这是阿里巴巴首次正式揭秘领域知识图谱。 本文将通过介绍 AliCoCo 的背景、定义、底层设计、构建过程中的一些算法问题,以及在电商搜索和推荐上的广泛应用,分享 AliCoCo 从诞生到成为阿里巴巴核心电商引擎的基石这一路走来的思考。
20833 2
阿里巴巴首次揭秘电商知识图谱AliCoCo!淘宝搜索原来这样玩!
|
11月前
|
存储 编解码 监控
针对3-15分钟视频的抽帧策略:让Qwen2.5 VL 32B理解视频内容
针对3-15分钟视频,提出高效抽帧策略:通过每5-10秒定间隔或关键帧检测方法,提取30-100帧关键图像,结合时间均匀采样与运动变化捕捉,降低冗余,提升Qwen2.5 VL 32B对视频内容的理解效率与准确性。
|
机器学习/深度学习 人工智能 算法
GSPO:Qwen让大模型强化学习训练告别崩溃,解决序列级强化学习中的稳定性问题
这是7月份的一篇论文,Qwen团队提出的群组序列策略优化算法及其在大规模语言模型强化学习训练中的技术突破
2098 0
GSPO:Qwen让大模型强化学习训练告别崩溃,解决序列级强化学习中的稳定性问题
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
1024 1
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
38_多模态模型:CLIP的视觉-语言对齐_深度解析
想象一下,当你看到一张小狗在草地上奔跑的图片时,你的大脑立刻就能将视觉信息与"小狗"、"草地"、"奔跑"等概念联系起来。这种跨模态的理解能力对于人类来说似乎是理所当然的,但对于人工智能系统而言,实现这种能力却经历了长期的技术挑战。多模态学习的出现,标志着AI从单一模态处理向更接近人类认知方式的综合信息处理迈出了关键一步。
1515 0
|
JSON 数据可视化 NoSQL
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
本文介绍了LangChain的LLM Graph Transformer框架,探讨了文本到图谱转换的双模式实现机制。基于工具的模式利用结构化输出和函数调用,简化了提示工程并支持属性提取;基于提示的模式则为不支持工具调用的模型提供了备选方案。通过精确定义图谱模式(包括节点类型、关系类型及其约束),显著提升了提取结果的一致性和可靠性。LLM Graph Transformer为非结构化数据的结构化表示提供了可靠的技术方案,支持RAG应用和复杂查询处理。
1582 2
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
|
机器学习/深度学习 数据可视化 算法框架/工具
Python小项目:利用U-net完成细胞图像分割
这个项目能够锻炼你的深度学习技能,同时也能在医学、生物等领域有实际应用。你可以参考相关的教程和资源,如 GitHub 上的 U-Net 项目,以获得更详细的指导。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
361 3
|
算法
简单的KMP的next、nextval数组求解办法(存档自己用来复习)
简单的KMP的next、nextval数组求解办法(存档自己用来复习)
1937 2