1月7日

news/2025/1/7 20:08:58/文章来源:https://www.cnblogs.com/Cakefish/p/18658292
上午思维题训练

https://codeforces.com/contest/2026/problem/C

https://codeforces.com/contest/2026/problem/B

https://codeforces.com/contest/2023/problem/A

https://codeforces.com/contest/2034/problem/D

下午

https://vjudge.net/problem/HDU-4612

题意:有一个无向图,加一条无向边使得这个图的割边最小。

思路:通过eDcc缩点,缩成一棵树,然后求树的直径,答案就是割边-树的直径

思路AC,代码没有AC,一直MLE,日后再改。

#include <bits/stdc++.h>
//#define int long long
#define endl '\n'
using namespace std;
//typedef unsigned __int128 LL;
const int N=2e4+10,M=1e6+10,inf=1e16,mod=1e8;
int n,m;
struct edge{int v,last;
}e[M];
int h[N],idx;//0开始
vector<int> fir;
void add(int u,int v) {fir.push_back(u);e[idx].v=v;e[idx].last=h[u];h[u] = idx++;
}
int dfn[N],low[N],tot;
stack<int> stk;
int dcc[N],cnt;//dcc记录边双连通分量
int bri[M];//bri[i]记录割边
void tarjan(int x,int edg) {dfn[x] = low[x] = ++tot;stk.push(x);for (int i = h[x]; ~i; i = e[i].last) {int y = e[i].v;if (!dfn[y]) {tarjan(y, i);low[x] = min(low[y], low[x]);if (low[y] > dfn[x]) {//割边bri[i] = 1;bri[i ^ 1] = 1;}} else if (i != (edg ^ 1)) {low[x] = min(dfn[y], low[x]);}}//离,判边双连通分量if (dfn[x] == low[x]) {++cnt;while (1) {int y = stk.top();stk.pop();dcc[y] = cnt;if (x == y) break;}}
}
vector<int> ne[N];
int ans=0;
int dfs(int u,int f){int d1=0,d2=0;for(auto v:ne[u]){if(v==f) continue;int d=dfs(v,u)+1;if(d>d1) d2=d1,d1=d;else if(d>d2) d2=d;}ans=max(ans,d1+d2);return d1;
}
void solve() {while(cin>>n>>m){if(n==0&&m==0) break;idx=tot=cnt=ans=0;for(int i=0;i<=n;i++) {dfn[i]=low[i]=0;h[i]=-1;dcc[i]=0;ne[i].clear();}while(!stk.empty()) stk.pop();for(int i=0;i<=m;i++){e[i].v=-1,e[i].last=-1;bri[i]=0;}for(int i=1;i<=m;i++){int u,v;cin>>u>>v;add(u,v);add(v,u);}for(int i=1;i<=n;i++){if(!dfn[i]) tarjan(i,-1);}for(int i=0;i<idx;i++){if(bri[i]){ne[dcc[fir[i]]].push_back(dcc[e[i].v]);}}dfs(1,-1);cout<<cnt-1-ans<<endl;}
}signed main() {ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//    int _;
//    cin >> _;
//    while (_--)solve();return 0;
}

畅通工程再续 - HDU 1875 - Virtual Judge

这题比较典,数据较小,所以暴力建边,然后并查集求最小生成树。

#include <bits/stdc++.h>
//#define int long long
#define endl '\n'
using namespace std;
//typedef unsigned __int128 LL;
const int N=105,M=1e6+10,inf=1e16,mod=1e8;
double dis[105][105];
int fa[N];
struct node {double x, y;
};
double f(node a,node b) {return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
struct node1 {int u, v;double w;
}e[M];
int find(int x) {if (fa[x] == x) return x;return fa[x] = find(fa[x]);
}void solve() {int n;cin >> n;vector<node> v;v.push_back({0, 0});for (int i = 1; i <= n; i++) {double x, y;cin >> x >> y;v.push_back({x, y});}int cnt = 0;for (int i = 1; i <= n; i++) {for (int j = 1; j < i; j++) {dis[j][i] = f(v[j], v[i]);++cnt;e[cnt].u = j, e[cnt].v = i, e[cnt].w = dis[j][i];}}auto cmp = [&](node1 a, node1 b) {return a.w < b.w;};double ans = 0;for (int i = 1; i <= n; i++) fa[i] = i;sort(e + 1, e + cnt + 1, cmp);auto kruscal = [&]() {int num = 0;for (int i = 1; i <= cnt; i++) {if (e[i].w > 1000) break;if (e[i].w < 10) continue;int x = find(e[i].u);int y = find(e[i].v);if (x != y) {fa[x] = y;ans += e[i].w;num++;}}return num == n - 1;};if (kruscal()) printf("%.1lf\n", ans * 100);else cout << "oh!" << endl;
}signed main() {ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);int _;cin >> _;while (_--)solve();return 0;
}

[P1967 NOIP2013 提高组] 货车运输 - 洛谷 | 计算机科学教育新生态

题意:有一个带权无向图,现在询问图上任意两点的所有路径中最大的边权

思路:要求最大边权,所以,可想而知,图上有些小边权是用不上的,所以要去掉一些边,首先建最大生成树,

然后在最大生成树上求任意两点的路径最大边权,倍增求LCA的时候,可以求出树上俩点的路径,是在图上向上跳,递推而来的,同样,所以求最大边权可以求LCA得来。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
//typedef unsigned __int128 LL;
const int N=3e4+10,M=5e4+10,inf=1e16,mod=1e8;
int fa[N],dfn[N],dep[N];
int Fa[N][25],dis[N][25],tot;
int n,m;
struct edge {int u, v, w;bool operator<(const edge &t) const {return w > t.w;}
}e[M];
struct node {int v, w;
};
vector<node> ne[N];
int find(int x) {if (x == fa[x]) return x;return fa[x] = find(fa[x]);
}void kruscal() {for (int i = 1; i <= m; i++) {int x = find(e[i].u), y = find(e[i].v);if (x != y) {fa[x] = y;ne[e[i].u].push_back({e[i].v, e[i].w});ne[e[i].v].push_back({e[i].u, e[i].w});}}
}void dfs(int now,int f) {dep[now] = dep[f] + 1;dfn[now] = ++tot;Fa[now][0] = f;for (int i = 0; i <= 21; i++) {Fa[now][i + 1] = Fa[Fa[now][i]][i];if (dfn[Fa[now][i + 1]]) dis[now][i + 1] = min(dis[now][i], dis[Fa[now][i]][i]);}for (auto k: ne[now]) {int v = k.v, w = k.w;if (v != f) {dis[v][0] = w;dfs(v, now);}}
}
int lca(int x,int y) {int ans = 1e16;if (dep[x] < dep[y]) swap(x, y);for (int i = 22; i >= 0; i--) {if (dep[Fa[x][i]] >= dep[y]) ans = min(ans, dis[x][i]), x = Fa[x][i];}if (x == y) return ans;for (int i = 22; i >= 0; i--) {if (Fa[x][i] != Fa[y][i]) {ans = min(ans, min(dis[x][i], dis[y][i]));x = Fa[x][i], y = Fa[y][i];}}ans = min(ans, min(dis[x][0], dis[y][0]));return ans;
}
void solve() {cin >> n >> m;for (int i = 1; i <= m; i++) {cin >> e[i].u >> e[i].v >> e[i].w;}for (int i = 1; i <= n; i++) fa[i] = i;sort(e + 1, e + m + 1);kruscal();for (int i = 1; i <= n; i++) {for (int j = 0; j <= 22; j++) dis[i][j] = 1e16;}for (int i = 1; i <= n; i++) {if (!dfn[i]) dis[i][0] = 1e16, dfs(i, 0);}int q;cin >> q;while (q--) {int x, y;cin >> x >> y;if (find(x) != find(y)) {cout << -1 << endl;continue;}cout << lca(x, y) << endl;}
}signed main() {ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//    int _;
//    cin >> _;
//    while (_--)solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865502.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SecureFX for Mac FTP/SSH传输工具

SecureFX for Mac FTP/SSH传输工具 SecureFX mac破解版是一款Mac平台的FTP/SSH传输工具。SecureFX for Mac支持三种文件传输协议:FTP、SFTP 和 FTP over SSH2。它可以提供安全文件传输。无论您连接的是任何一种操作系统的服务器,它都能提供安全的传输服务。它主要用于Linux操…

Debian 11/12一键更换国内系统源

有时候买了国内的服务器,更新系统或者安装软件速度相当慢,这时候我们可以将系统源一键更换为国内的源,速度就会快很多!一、备份现有apt源配置 cp -a /etc/apt/sources.list /etc/apt/sources.list.bak二、替换为其他apt源 Debian11 1、清华源 这是一条命令,全部复制后,直…

创建销售订单BAPI报错,SLS_LORD 033

只提示一个凭证 不能保存的消息,没有任何提示及字段信息 跟消息断点发现是被增强卡住了

用 Modbus 软件配置 Modbus tcp 转 ETHERCAT 步骤

在工业自动化控制系统中,常常会遇到不同协议设备集成的需求。例如,部分设备采用 Modbus tcp 协议进行通信,而另一些设备则基于 ETHERCAT 协议运行。这种协议差异导致设备之间无法直接进行数据交互,严重影响了整个系统的协同工作和自动化程度。为解决这一问题,我们引入捷米…

pd虚拟机 [po] Parallels Desktop 20 激活 for Mac [jie] 安装教程【支持M芯片】

pd虚拟机 [po] Parallels Desktop 20 激活 for Mac [jie] 安装教程【支持M芯片】 Parallels Desktop 20 ,是一款Mac虚拟机软件,在搭载Apple M 系列芯片的任何 Mac 上运行 Windows,体验不同操作系统之间无缝集成。使用 Parallels Desktop 20 for Mac 体验 macOS 和 Windows 的…

【触想智能】什么是嵌入式工业一体机以及它的特点和应用领域分析

嵌入式工业一体机是一种集成了计算、控制、通信等功能的高度集成化设备。它在工业自动化领域中有着广泛的应用,为工厂生产、数据处理、监控和管理提供了全面的解决方案。下面是嵌入式工业一体机的定义、特点以及主要应用领域的具体介绍。一、嵌入式工业一体机的定义嵌入式工业…

VMware Fusion Pro 13 for Mac虚拟机软件

VMware Fusion Pro 13 for Mac虚拟机软件 VMware Fusion Pro for Mac,是一款mac虚拟机软件,跟Parallels Desktop一样,都可以让你的 Mac 同时运行一个或多个不同的操作系统。VMware Fusion Pro mac不仅能让你在Mac苹果电脑上运行Windows或Linux系统、使用非Mac平台的软件,而…

空压机网络接入实战:基于 MODBUS - TCP 转 Ethernet IP 网关的配置过程剖析

在工业自动化生产环境中,空压机作为重要的气源设备,其稳定运行和有效监控对于整个生产流程至关重要。然而,不同厂家生产的空压机可能采用不同的通信协议,这给集中监控和管理带来了挑战。在本次案例中,我们遇到的空压机采用 MODBUS - TCP 协议进行数据传输,但企业的自动化…

【CUMT】软件工程期末复习

1.软件工程概述1.2 计算机软件概述 1.4 软件生命周期 1.5 软件开发模型2.项目计划2.2 可行性研究3.需求分析3.2 数据流图DFD 3.3 数据字典DD 3.4 加工逻辑描述工具4.面向对象方法(OOA)4.2 统一建模语言UML 4.3 用例模型5.概要设计5.1 软件开发流程概念区分 5.2 软件结构设计 …

【vulnhub靶场】日志投毒与文件包含漏洞 Solstice

一、侦查1.1 收集目标网络信息:IP地址1.2 主动扫描:扫描IP地址段 二、初始访问2.1 利用面向公众的应用 三、权限提升3.1 利用漏洞提权:高权限运行的程序一、侦查 1.1 收集目标网络信息:IP地址 靶机启动后,没有提供IP地址。由于Kali和靶机在同一个C段,可以扫描ARP协议获取…

城市生命线安全管理:数据要素整合与场景应用实践

城市生命线工程是确保城市正常运行和居民安全生活的关键基础设施,涉及供水、排水、燃气、电力等多个方面。随着信息技术的发展,特别是大数据、物联网、人工智能等技术的应用,城市生命线数据要素与场景应用的深度融合成为提升城市治理能力的重要途径。数据要素的重要性城市生…

SqlSugar入门教程:连接,增、删、改、查

原文链接:https://blog.csdn.net/zls365365/article/details/131199132 第一步,自然是新建一个项目,控制台什么都可以。因为我还没想好怎么做一个完整的项目,那暂且用一个控制台举例吧。 下面自然是从NuGet安装sqlsugar了。注意鉴别需要安装的版本,我这里是安装sqlsugarc…