【删边问题——Tarjan求割边】

ops/2025/2/27 3:30:46/

题目

并查集暴力代码 30p

#include <bits/stdc++.h>
using namespace std;
using ll = long long;const int N = 1e5+10;int n, m;
int a[N], p[N];
ll ans = 1e18;
ll s[3];
bool st;struct edge
{int a, b;
} e[N];void init()
{for(int i = 1; i <= n; i++)p[i] = i;
}int find(int x)
{if(p[x] != x) p[x] = find(p[x]);return p[x];
}void check()
{int cnt = 0;int fir = find(1);for(int i = 1; i <= n; i++){if(p[i] == i) cnt++;if(p[i] == fir) s[1] += a[i];else s[2] += a[i];}if(cnt == 2) st = true, ans = min(ans, abs(s[2] - s[1]));
}
int main()
{scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++)scanf("%d", a+i);for(int i = 1; i <= m; i++){int a, b;scanf("%d%d", &a, &b);e[i] = {a, b};}for(int i = 1; i <= m; i++){init(); s[1] = s[2] = 0;for(int j = 1; j <= m; j++){if(i == j) continue;int a = e[j].a, b = e[j].b;int pa = find(a), pb = find(b);if(pa != pb) p[pa] = pb;}check();}if(st) printf("%lld", ans);else puts("-1");
}

正解

#include <bits/stdc++.h>
using namespace std;
using ll = long long;const int N = 2e5+10;
const int M = 4e5+10;int n, m;
int a[N]; //权重
ll f[N]; //子树权重和
int h[N], e[M], ne[M], idx; //链式前向星
ll sum, ans = 1e18; //权重和 答案
int dfn[N], low[N], tot; //时间戳 追溯值 分配器
bool flag; //割边存在性void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}void tarjan(int u, int ine)
{dfn[u] = ++tot, low[u] = tot;f[u] = a[u];for(int i = h[u]; ~i; i = ne[i]){int j = e[i];if(!dfn[j]){tarjan(j, i);f[u] += f[j];low[u] = min(low[u], low[j]);if(low[j] > dfn[u]) //这里放在向下的部分,因为dfn[u]是固定的,向上的部分只会影响到low[u]{ans = min(ans, abs(sum - 2 * f[j]));flag = true;}}else if(i != (ine ^ 1))low[u] = min(low[u], dfn[j]);}
}
int main()
{scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++){scanf("%d", a+i);sum += a[i];}memset(h, -1, sizeof h);for(int i = 1; i <= m; i++){int a, b;scanf("%d%d", &a, &b);add(a, b); add(b, a);}tarjan(1, -1); //调用时,第二个参数随便给if(f[1] != sum) ans = sum - 2 * f[1]; //不是连通图,直接求差(本题默认所给图最多两个连通分量)elseif(!flag) ans = -1; //是连通图,无割边printf("%lld", ans); 
}


http://www.ppmy.cn/ops/161579.html

相关文章

DeepSeek基础之机器学习

文章目录 一、核心概念总结&#xff08;一&#xff09;机器学习基本定义&#xff08;二&#xff09;基本术语&#xff08;三&#xff09;假设空间&#xff08;四&#xff09;归纳偏好&#xff08;五&#xff09;“没有免费的午餐”定理&#xff08;NFL 定理&#xff09; 二、重…

【数据挖掘在量化交易中的应用:特征发现与特征提取】

好的&#xff0c;我将撰写一篇关于金融领域数据挖掘的技术博客&#xff0c;重点阐述特征发现和特征提取&#xff0c;特别是在量化交易中的应用。我会提供具体的实操步骤&#xff0c;并结合Python和TensorFlow进行代码示例。 完成后&#xff0c;我会通知您进行查看。 数据挖掘…

面试题——简述Vue 3的服务器端渲染(SSR)是如何工作的?

面试题——简述Vue3的服务器端渲染&#xff08;SSR&#xff09;是如何工作的&#xff1f; 服务器端渲染&#xff08;SSR&#xff09;已经成为了一个热门话题。Vue 3&#xff0c;作为一款流行的前端框架&#xff0c;也提供了强大的SSR支持。那么&#xff0c;Vue 3的SSR究竟是如何…

前端排序算法完全指南:从理论到实践

<!DOCTYPE html> <html> <head><title>前端排序算法终极指南</title><style>.container { max-width: 1000px; margin: 0 auto; padding: 20px; }.demo-container { margin: 30px 0; border: 1px solid #eee; padding: 20px; }.bars-wrapp…

Ascend NPU 架构 CANN 平台入门学习

Ascend NPU 架构 & CANN 平台入门学习 文章目录 Ascend NPU 架构 & CANN 平台入门学习 一、概述二、NPU 硬件架构 2.1 NPU SOC 架构 2.1.1 Ascend 3XX 架构2.1.2 Ascend 9XX 架构 2.2 NPU 达芬奇架构 2.2.1 计算单元2.2.2 存储单元2.2.3 控制单元 2.3 AI Core 电路结…

Mac 版 本地部署deepseek ➕ RAGflow 知识库搭建流程分享(附问题解决方法)

安装&#xff1a; 1、首先按照此视频的流程一步一步进行安装&#xff1a;(macos版&#xff09;ragflowdeepseek 私域知识库搭建流程分享_哔哩哔哩_bilibili 2、RAGflow 官网文档指南&#xff1a;https://ragflow.io 3、RAGflow 下载地址&#xff1a;https://github.com/infi…

《论单元测试方法及应用》审题技巧 - 系统架构设计师

论文写作框架 一、考点概述 本论题主要考察软件测试工程师在软件项目管理与开发过程中的实践经验和理论知识。论题涵盖三大核心内容&#xff1a;一是参与管理和开发的软件项目的概述及个人主要工作职责&#xff1b;二是静态测试和动态测试这两种单元测试方法的基本内容&#…

无人机的最长悬停时间为什么短于最长飞行时间

最长飞行时间 65分钟&#xff08;空载&#xff09; 最长悬停时间 60分钟&#xff08;空载&#xff09; 1.这是一款无人机的数据&#xff0c;为什么最长悬停时间比最长飞行时间短&#xff1f; 无人机悬停时间比飞行时间短的现象看似矛盾&#xff0c;实则与空气动力学原理和能量…