Codeforces Round 954 (Div. 3) F. Non-academic Problem

ops/2024/10/19 9:45:43/

在这里插入图片描述
思路:考虑缩点,因为是无向图,所以双连通分量缩完点后是一棵树,我们去枚举删除每一条树边的答案,然后取最小值即可。

#include <bits/stdc++.h>using namespace std;
const int N = 3e5 + 5;
typedef long long ll;
typedef pair<int,int> pll;
typedef array<ll, 3> ar;
int mod = 1e9+7;
const int maxv = 4e6 + 5;
// #define endl "\n"int n,m;
vector<pll> e[N];
vector<int> e2[N];
vector<vector<int> > vdcc;
int dfsn[N],low[N],tot,b[N],sz[N];
stack<int> s;void add(int u,int v,int i)
{e[u].push_back({v,i});e[v].push_back({u,i});
}void tarjan(int x,int f)//tarjan 求边双连通分量
{dfsn[x]=low[x]=++tot,s.push(x);for(auto [u,i]: e[x]){if(!dfsn[u]){tarjan(u,i);low[x]=min(low[x],low[u]);}else if(f!=i) low[x]=min(low[x],dfsn[u]);}if(dfsn[x]==low[x]){vector<int> c;while(1){auto t=s.top();b[t]=vdcc.size();sz[vdcc.size()]++;c.push_back(t);s.pop();if(t==x) break;}vdcc.push_back(c);}
}void init()
{tot=0;for(int i=0;i<=n;i++){e[i].clear();e2[i].clear();dfsn[i]=b[i]=sz[i]=low[i]=0;}vdcc.clear();}ll ans=1e18;int dfs(int x,int f)
{ll sum=0;for(auto u: e2[x]){if(u!=f) sum+=dfs(u,x);}sum+=sz[x];ll res=n-sum;ans=min(ans,(sum)*(sum-1)/2+(res-1)*res/2);return sum;
}void solve()
{cin>>n>>m;init();ans=1e18;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;add(u,v,i);}for(int i=1;i<=n;i++){if(!dfsn[i]) tarjan(i,-1);}for(int i=1;i<=n;i++){for(auto [j,id]: e[i]){if(b[i]!=b[j]){e2[b[i]].push_back(b[j]);// e2[b[j]].push_back(b[i]);}}}dfs(b[1],-1);cout<<ans<<endl;
} int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;cin>>t;while(t--){solve();}system("pause");return 0;
}

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

相关文章

【单链表】05 有一个带头结点的单链表L,设计一个算法使其元素递增有序。

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux算法题上机准备 &#x1f618;欢迎 ❤️关注 &#x1f44d;点赞 &#x1f64c;收藏 ✍️留言 题目 有一个带头结点的单链表L,设计一个算法使其元素递增有序。 算法思路 解决办法有很多&…

基于Lua源码开发动态库供lua脚本使用

通过require的方式可以加载动态库&#xff0c;然后脚本就可以使用库中提供的函数&#xff0c;一般过程如下&#xff1a; 比如有一个动态库名为&#xff1a;MyFirstLua.dll 则使用时&#xff1a;MyFirstLua require("MyFirstLua") 导出的函数接口名称一定是 int l…

【JavaScript】具有 iterable 接口的数据结构

具有 iterable 接口的数据结构指的是可以通过迭代器&#xff08;Iterator&#xff09;访问其成员的数据结构。在 JavaScript 中&#xff0c;具有 iterable 接口的数据结构包括数组&#xff08;Array&#xff09;、字符串&#xff08;String&#xff09;、Set、Map 等。这些数据…

扩散模型笔记2

Ref:扩散模型的原理及实现&#xff08;Pytorch&#xff09; 在扩散模型中&#xff0c;每一步添加的噪声并不是完全一样的。具体来说&#xff0c;噪声的添加方式和量在每一步是根据特定的规则或公式变化的。这里我们详细解释每一步添加噪声的过程。 正向过程中的噪声添加&…

JVM详解

目录 一、介绍 1.定义 2.组成划分 二、类加载系统 1.类的加载过程 2.类加载器 三、双亲委派机制 过程 双亲委派模型的优点 四、运行时数据区 五、对象的创建流程 六、垃圾回收机制 1.定义 1.1 引用计数法 1.2 可达性分析算法&#xff1a;GC Roots根 2.垃圾回收…

uniApp 封装VUEX

Vuex Store (index.js) import Vue from vue; import Vuex from vuex; import Cookies from js-cookie;Vue.use(Vuex);const saveStateKeys [vuex_user, vuex_token, vuex_demo];const initialState {vuex_user: { name: 用户信息 },vuex_token: Cookies.get(token) || ,vue…

【linux/shell】shell中实现函数重载

在 shell 脚本中&#xff0c;函数重载&#xff08;Function Overloading&#xff09;的概念与一些编程语言&#xff08;如 Java 或 C#&#xff09;中的函数重载不同。在这些编程语言中&#xff0c;你可以定义多个同名函数&#xff0c;只要它们的参数列表不同。然而&#xff0c;…

求函数最小值-torch版

目标&#xff1a;torch实现下面链接中的梯度下降法 先计算 的导函数 &#xff0c;然后计算导函数 在处的梯度 (导数) 让 沿着 梯度的负方向移动&#xff0c; 自变量 的更新过程如下 torch代码实现如下 import torchx torch.tensor([7.5],requires_gradTrue) # print(x.gr…