Acwing 368.银河(tarjan缩点优化差分约束)

简介: 笔记

tarjan求scc优化差分约束


差分约束的两种模型:求最小值和最大值 分别对应最长路和最短路。


对于最长路模型,判断是否无解的依据是图中有没有正环。考虑tarjan算法缩点后的某个scc,如果这个scc中有某条边权值大于0 ,且scc中的任意两个点都可互相到达,所以一定存在正环,即不满足差分约束的条件。


最短路模型同理。


因为同一scc内部的边权都为0,所以同一个scc中的所有点到超级源点的距离都相同,只需要对tarjan缩点后的拓扑图跑最短/长路,求出每个scc的最短/长路即可。


Acwing 368.银河

题意

银河中的恒星浩如烟海,但是我们只关注那些最亮的恒星。

我们用一个正整数来表示恒星的亮度,数值越大则恒星就越亮,恒星的亮度最暗是 1 。

现在对于 N颗我们关注的恒星,有 M 对亮度之间的相对关系已经判明。

你的任务就是求出这 N 颗恒星的亮度值总和至少有多大。

输入格式

第一行给出两个整数 N NN 和 M 。  

之后 M 行,每行三个整数 T,A,B ,表示一对恒星 (A,B) 之间的亮度关系。恒星的编号从 1 开始。

如果T=1 ,说明 A和 B  亮度相等。

如果 T=2 ,说明 A 的亮度小于B 的亮度。

如果 T=3 ,说明 A 的亮度不小于 B 的亮度。

如果 T=4 ,说明 A AA 的亮度大于 B 的亮度。

如果 T=5, 说明 A  的亮度不大于 B  的亮度


思路

先根据差分约束建图,再用tarjan算法缩点求拓扑图。如果建拓扑图时,同一scc中的点之间的边权不为0,则说明有正环,无解。否则对生成的拓扑图跑最长路,最后所有scc对应的最长路长度乘以scc中点的个数即为最终答案。


代码

const int N = 1e5 + 10, M = 8 * N;
int h[N],hs[N],e[M],w[M],ne[M],idx;
int siz[N],id[N];
int scc,timestamp;
int n, m;
int dfn[N],low[N];
stack<int>stk;
bool in_stk[N];
int dp[N];
void add(int h[],int a,int b,int c){
  e[idx] = b,w[idx] = c,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();
      siz[scc]++;
      id[y] = scc;
      in_stk[y] = false;
    }while(y != u);
  }
}
void solve() {
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    memset(hs,-1,sizeof hs);
    while(m--){
      int t,u,v;scanf("%d%d%d",&t,&u,&v);
      if(t == 1)add(h,v,u,0),add(h,u,v,0);
      else if(t == 2)add(h,u,v,1);
      else if(t == 3)add(h,v,u,0);
      else if(t == 4)add(h,v,u,1);
      else if(t == 5)add(h,u,v,0);
    }
    for(int i = 1; i <= n;++i){
      add(h,0,i,1);
    }
    tarjan(0);
    bool flag = true;
    for(int i = 0; i <= n;++i){ // 建拓扑图
      for(int j = h[i];~j;j = ne[j]){
        int k = e[j];
        int dis = w[j];
        if(id[i] != id[k]){
          add(hs,id[i],id[k],dis);
        }
        else {
          if(dis > 0){
            flag = false;
            break;
          }
        }
      }
      if(!flag)break;
    }
    if(!flag)puts("-1");
    else {
      for(int i = scc; i;--i){
        for(int j = hs[i];~j;j = ne[j]){
          int k = e[j];
          int dis = w[j];
          dp[k] = max(dp[k],dp[i] + dis);
        }
      }
      LL res = 0;
      for(int i = 1; i <= scc;++i){
        res += (LL)siz[i] * dp[i];
      }
      cout << res << endl;
    }
}
signed main() {
    //int _; cin >> _;
    //while (_--)
        solve();
    return 0;
}


目录
相关文章
|
Oracle 安全 关系型数据库
搭建 OpenLDAP 自助修改密码系统
让修改open ldap密码变得简单
1678 0
搭建 OpenLDAP 自助修改密码系统
|
JavaScript 前端开发
nodejs实现解析chm文件列表,无需转换为PDF文件格式,在线预览chm文件以及目录,不依赖任何网页端插件
nodejs实现解析chm文件列表,无需转换为PDF文件格式,在线预览chm文件以及目录,不依赖任何网页端插件
|
人工智能 弹性计算 运维
AI驱动的操作系统服务评测报告
阿里云推出AI驱动的一站式免费操作系统服务套件,包含SysOM管控组件和OS Copilot智能助手,提供集群健康监测、深度系统诊断等功能。通过直观的操作界面和详尽的诊断报告,帮助运维人员优化系统性能,提高工作效率。特别针对EOL操作系统提供订阅管理服务,确保系统安全。整体体验令人满意,但在文档详细度和定制化方面仍有提升空间。
330 14
|
10月前
|
数据采集 人工智能 监控
40.8K star!让AI帮你读懂整个互联网:Crawl4AI开源爬虫工具深度解析
Crawl4AI 是2025年GitHub上备受瞩目的开源网络爬虫工具,专为AI时代设计。它不仅能抓取网页内容,还能理解页面语义结构,生成适配大语言模型的训练数据格式。上线半年获4万+星标,应用于1200+AI项目。其功能亮点包括智能内容提取引擎、AI就绪数据管道和企业级特性,支持动态页面处理、多语言识别及分布式部署。技术架构基于Python 3.10与Scrapy框架,性能卓越,适用于AI训练数据采集、行业情报监控等场景。相比Scrapy、BeautifulSoup等传统工具,Crawl4AI在动态页面支持、PDF解析和语义分块方面更具优势
3532 0
40.8K star!让AI帮你读懂整个互联网:Crawl4AI开源爬虫工具深度解析
|
机器学习/深度学习 人工智能 自然语言处理
轻松复现一张AI图片
现在有一个非常漂亮的AI图片,你是不是想知道他是怎么生成的?今天我会交给大家三种方法,学会了,什么图都可以手到擒来了。
轻松复现一张AI图片
|
SQL 分布式计算 监控
大数据时代的五大利剑
大数据时代的五大利剑
1102 12
|
SQL 机器学习/深度学习 人工智能
聚焦高速互连SI性能研究丨阿里云技术论文入选IEEE EPEPS 2024和PCB West 2024
阿里云服务器研发团队3篇论文入选IEEE EPEPS 2024和PCB West 2024,聚焦高速互连下SI性能研究。
|
数据可视化 JavaScript 定位技术
Cesium第1篇,CesiumJS第1篇,CesiumJS使用详细,在vue中使用Cesium.js(WebGIS中的Cesium地图可视化应用)
Cesium是一种基于WebGL开源的虚拟地球技术,可以用于构建高性能、跨平台的三维地球应用程序,它支持多种数据格式和地图服务,可以实现地球表面的高精度渲染、地形分析、数据可视化等功能。Cesium还提供了丰富的API和插件,方便开发者进行二次开发和定制化,且可免费商用,在航空航天、国防、城市规划、教育等领域得到了广泛应用。
1801 0
Cesium第1篇,CesiumJS第1篇,CesiumJS使用详细,在vue中使用Cesium.js(WebGIS中的Cesium地图可视化应用)
|
机器学习/深度学习 PyTorch 算法框架/工具
深度学习参数初始化(一)Xavier初始化 含代码
深度学习参数初始化(一)Xavier初始化 含代码
779 2
|
JSON 并行计算 API
使用CJSON/Nlohmann:快速简便地在C/C++中处理JSON数据
使用CJSON/Nlohmann:快速简便地在C/C++中处理JSON数据
3474 0