图论 2023.11.20

次短路

P2829 大逃离
题意:给定一个无向图,入口1,出口n,求第二短路的值
一个节点所直接连接的地方小于k个(起点和终点除外),那么他就不敢进去。
n<=5000,m<=100000
思路:次短路为某一条边的长度+起点到该边一条端点的最短路+终点到另一条边的最短路
spfa跑从起点,从终点的最短路,之后枚举所有的边,连接点的记录可能有重边用vis标记
 

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
#define fr(i,z,n) for(int i = z;i <= n; i++)
#define fer(i,x)   for(int i=e.head[x];i;i=e.next[i])
const int N = 5002, M = 100002, INF = 1e9 + 7;
int n, m, k, mindist, secdist = INF;//mindist最短路,secdist次短路
int  t[N], dist[2][N];//t是每个点的出边数
bool used[N], vis[N];
template<size_t size>
struct Road {int to[size], next[size], head[size], cnt = 1;int w[size];void add(int x, int y, int ww) {to[cnt] = y;w[cnt] = ww;next[cnt] = head[x];head[x] = cnt++;}void clear(int n) {for (int i = 0; i <= n; i++) {head[i] = 0;}cnt = 1;}
};
Road<(100010<<1)>e;
void SPFA(int S, int op)//op=0是起点的参数,op=1是终点的参数
{for (int i = 1; i <= n; i++) {dist[op][i] = INF, used[i] = 0;}queue<int> Q;Q.push(S);used[S] = 1;dist[op][S] = 0;while (!Q.empty()){int now = Q.front(); Q.pop();used[now] = 0;fer(i,now){int v = e.to[i];int w = e.w[i];if (dist[op][now] +w < dist[op][v] && t[v] >= k)//筛掉不合法的(即小于k的){dist[op][v] = dist[op][now] + w;if (!used[v]) { Q.push(v); used[v] = 1; }}}}
}
int main() {scanf("%d%d%d", &n, &m, &k);for (int i = 1; i <= m; i++) {int u, v, w;scanf("%d%d%d", &u, &v, &w);e.add(u, v, w);e.add(v, u, w);}fr(i, 1, n) {          //记录每一个节点的连接点数memset(vis, 0, sizeof(vis));fer(j, i) {int v = e.to[j];if (!vis[v]) {               //防止重边,自环也算t[i]++;vis[v] = 1;}}}t[1] = INF; t[n] = INF;      //起点与终点不包括SPFA(1, 0);SPFA(n, 1);mindist = dist[0][n];for (int i = 1; i <= n; i++) {    //枚举所有边if (t[i] < k)continue;fer(j, i) {{int v = e.to[j];int len = dist[0][i] + e.w[j] + dist[1][v];if (len > mindist && t[v] >= k)secdist = min(secdist, len);}}}printf("%d\n", secdist >= INF ? -1 : secdist);return 0;
}

单源最短路->多源最短路

P5304 [GXOI/GZOI2019] 旅行者(单源最短路->多源最短路)
题意:给定一个有向图,求给定的k个城市的两两城市间最短路的最小值
n<=1e5,m<=5e5,k<=n
思路:两遍dijkstra,
第一次将所有给定点的点加入到队列,(相当于从所有给定点出发到其他点的最短路)
于是需要维护两个东西。1.最短路的距离,2到当前点的最短路的起点(相当于染色操作)
第二次建立反图,同样将所有给定点的点加入到队列,求出其他点到给定点的最短路
同样维护两个东西。1.最短路的距离,2最短路对应的终点
遍历每一条边当起点!=终点(自环)时,更新答案
 

#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<math.h>
#include<map>
#include<vector>
#include<stack>
#include<array>
#define endl '\n'
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
#define ms(x,y) memset(x,y,sizeof x);
#define YES cout<<"YES"<<'\n';
#define NO  cout<<"NO"<<'\n';
#define fr(i,z,n) for(int i = z;i <= n; i++)
#define fer(i,x)   for(int i=e.head[x];i;i=e.next[i])
#define fer1(i,x)   for(int i=e1.head[x];i;i=e1.next[i])
#define ufr(i,n,z) for(int i = n;i >= z; i--)
#define int long long
typedef long long ll;
const ll N = 2e5 + 10, inf = 1e18;
const ll mod = 1e9 + 7;
using namespace std;
template<size_t size>
struct Road {int to[size], next[size], head[size], cnt = 1;ll w[size];void add(int x, int y, ll ww) {to[cnt] = y;w[cnt] = ww;next[cnt] = head[x];head[x] = cnt++;}void clear(int n) {for (int i = 0; i <= n; i++) {head[i] = 0;}cnt = 1;}
};
Road<(500010)>e;
Road<(500010)>e1;
int a[N];
int dis1[N], dis2[N];
int col1[N], col2[N];
bool vis[N];
int n, m, k;
void dijkstra1() {fr(i, 1, n) {dis1[i] = inf;vis[i] = 0;}priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;fr(i, 1, k) {q.push({ 0,a[i] });dis1[a[i]] = 0;col1[a[i]] = a[i];}while (!q.empty()) {int x = q.top().second;q.pop();if (vis[x]) {continue;}vis[x] = 1;fer(i, x) {int v = e.to[i];int w = e.w[i];if (dis1[x] + w < dis1[v]) {dis1[v] = dis1[x] + w;q.push({ dis1[v],v });col1[v] = col1[x];                 //染色,标记起点}}}
}
void dijkstra2() {fr(i, 1, n) {dis2[i] = inf;vis[i] = 0;col2[i] = 0;}priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;fr(i, 1, k) {q.push({ 0,a[i] });dis2[a[i]] = 0;col2[a[i]] = a[i];}while (!q.empty()) {int x = q.top().second;q.pop();if (vis[x]) {continue;}vis[x] = 1;fer1(i, x) {int v = e1.to[i];int w = e1.w[i];if (dis2[x] + w < dis2[v]) {dis2[v] = dis2[x] + w;q.push({ dis2[v],v });col2[v] = col2[x];                 //染色,标记起点}}}
}
void solve() {cin >> n >> m >> k;e.clear(n);e1.clear(n);vector<array<int, 3>>ve;fr(i, 1, n) {col1[i] = 0;col2[i] = 0;}fr(i, 1, m) {int u, v, w;cin >> u >> v >> w;e.add(u, v, w);             //有向图e1.add(v, u, w);ve.push_back({ u,v,w });}fr(i, 1, k) {cin >> a[i];}dijkstra1();dijkstra2();int ans = inf;for (auto it : ve) {                     //遍历所有的边int u = it[0];int v = it[1];int w = it[2];// cout << u << ' ' << v << ' ' << col1[u] << ' ' << col2[v] << '\n';if ((col1[u]&&col2[v]) && col1[u] != col2[v]) {// cout << "YES" << '\n';ans = min(ans, dis1[u] + dis2[v]+w);}}cout << ans << '\n';
}signed main()
{ios;int t = 1;cin >> t;while (t--) {solve();}
}

割点+联通块

P3469 [POI2008] BLO-Blockade
给定一个无向图(图是联通的),无重边,对于每个节点求出去与节点i关联的所有边去掉以后(不去掉节点i本身),
无向图有多少个有序点(x, y),满足x 和y 不连通。
n<=1e5,m<=5e5
讨论要删的点是不是割点:
1.非割点,则为2*(n-1)
2.割点,导致变成多个联通块,不同联通块不可相互到达,
假设割后产生2个的联通块,大小为a,b,则贡献为2ab+2(n-1),
假设产生k联通块2(n-1)+2∑(1<=i<=k)∑(1<=j<=k,j!=i)sizei*sizej
会超时,∑(1<=j<=k,j!=i)sizej优化为n-sizei-1
于是变为2∑(1<=i<=k)sizei*(n-sizei-1)
转为求联通块大小问题
再dfs的过程中用sum防止重复计算的
 

#include<iostream>
#include<stack>
#include<algorithm>
#include<vector>
#include<queue>
#define int long long
const int N = 5e5 + 10;
using namespace std;
vector<int> edges[N];
vector<int> edges2[N];
stack<int>stk;
int dfsn[N], low[N], instk[N], cnt;
int n, m;
int ans[N], Size[N];
int tot;
void tarjan(int p){low[p] = dfsn[p] = ++cnt;instk[p] = 1;Size[p] = 1; int sum = 0;stk.push(p); // 进栈for (auto q : edges[p]) {if (!dfsn[q]) { // 未访问过tarjan(q); // 递归地搜索Size[p] += Size[q];       //子树的大小            if (low[q] >= dfsn[p]) {  // p为割点满足low[q] >= dfsn[p]ans[p] += Size[q] *(sum);   //以p为子树的贡献点sum += Size[q];} low[p] = min(low[p], low[q]);}else {low[p] = min(low[p], dfsn[q]);}}ans[p] += (n - sum - 1) * sum;//剩下的点产生的贡献!ans[p] += n - 1;
}
signed main() {cin >> n >> m;for (int i = 1; i <= m; i++) {int x, y;cin >> x >> y;edges[x].push_back(y);edges[y].push_back(x);}for (int i = 1; i <= n; ++i)if (!dfsn[i])tarjan(i);for (int i = 1; i <= n; i++) {cout << 2*ans[i] << '\n';}
}

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

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

相关文章

Pytorch np.arange函数

一、np.arange函数 NumPy中的arange函数是一种类似于Python内置的range函数的函数&#xff0c;不过arange函数返回的是一个数组&#xff0c;而不是列表。在NumPy中非常常用的函数之一。 import numpy as np arr np.arange(5) print(arr)输出结果为&#xff1a;[0 1 2 3 4] …

初刷leetcode题目(7)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

sql添加索引

1.基础使用 1.普通索引 添加INDEX ALTER TABLE table_name ADD INDEX index_name ( column )下面演示下给user表的name字段添加一个索引2.主键索引 添加PRIMARY KEY ALTER TABLE table_name ADD PRIMARY KEY ( column )3.唯一索引 添加UNIQUE ALTER TABLE table_name ADD UNIQ…

【书籍篇】Git 学习指南(一)基础概念及入门

Git 学习指南 第一部分&#xff08;一&#xff09;基础概念及入门 一. 基本概念1.1 分布式版本控制1.1.1 集中式版本控制系统1.1.2 分布式版本控制系统1.1.3 特型版本库 1.2 版本库&#xff0c;分布式工作的基础所在1.2.1 散列值 1.3 分支的创建与合并1.3.1 分支的其他操作 二.…

UE 调整材质UV贴图长宽比例

首先&#xff0c;为什么要先减去0.5呢&#xff0c;因为缩放的贴图中心在0,0原点&#xff0c;以这个点缩放效果是这样&#xff1a; 它缩放的图案不会在正中间&#xff0c;因为是以0,0点进行缩放的 以这个图的箭头去缩放图片的&#xff0c;所以不能使得缩放后的图片放在正中心 那…

【机器学习】038_梯度消失、梯度爆炸

一、原因 神经网络梯度 假设现在有一个 层的神经网络&#xff0c;每层的输出为一个对输入作 变换的函数结果 用 来表示第 层的输出&#xff0c;那么有下列公式&#xff1a; 链式法则计算损失 关于某一层某个参数 的梯度&#xff1a; 注意到&#xff0c; 为向量&am…

NX二次开发UF_CAM_ask_post_template_name 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_post_template_name Defined in: uf_cam.h int UF_CAM_ask_post_template_name(const char * * post_template_filename ) overview 概述 This function provides the name of the file…

git 提交成了LFS格式,如何恢复

平常习惯使用sourceTree提交代码&#xff0c;某次打开时弹出了一个【是否要使用LFS提交】的确认弹窗&#xff0c;当时不知道LFS是什么就点了确认&#xff0c;后续提交时代码全变成了这个样子 因为是初始化的项目首次提交&#xff0c;将近四百个文件全被格式化成了这个样子&…

利用ETLCloud自动化流程实现业务系统数据快速同步至数仓

现代企业有不少都完成了数字化的转型&#xff0c;而还未转型的企业或商铺也有进行数字化转型的趋势&#xff0c;由此可见&#xff0c;数据已经成为企业决策的重要依据。企业需要先获取数据&#xff0c;将业务系统数据同步至数仓进行整合&#xff0c;然后再进行数据分析。为了更…

Vatee万腾外汇市场新力量:vatee科技决策力

在当今数字化时代&#xff0c;Vatee万腾崭露头角&#xff0c;以其强大的科技决策力进军外汇市场&#xff0c;成为该领域的新力量。这一新动向将不仅塑造外汇市场的未来&#xff0c;也展现Vatee科技决策力在金融领域的引领作用。 Vatee万腾带着先进的科技决策力进入外汇市场&…

Java格式化类Format

文章目录 Format介绍Format方法- format&#xff08;格式化&#xff09;- parseObject&#xff08;解析&#xff09; 格式化分类日期时间格式化1. DateFormat常用方法getInstancegetDateInstancegetTimeInstancegetDateTimeInstance 方法入参styleLocale 2. SimpleDateFormat常…

Redis设计与实现-数据结构(建设进度15%)

Redis数据结构 引言数据结构stringSDS数据结构原生string的不足 hash 本博客基于《Redis设计与实现》进行整理和补充&#xff0c;该书依赖于Redis 3.0版本&#xff0c;但是Redis6.0版本在一些底层实现上仍然没有明显的变动&#xff0c;因此本文将在该书的基础上&#xff0c;对于…

【Android11】在内置的Tvsettings的界面中显示以太网Mac地址

【Android11】在内置的Tvsettings的界面中显示以太网Mac地址 了解Preference必要信息步骤&#xff1a;1. 在设置页面的xml文件中增加一个Preference &#xff0c;这是要显示出来的设置项2. 在strings.xml文件中增加我们在第一步新设置的值3. 为新加的设置项增加一个新的XXXPref…

CentOS7安装Docker遇到的问题笔记

笔记/朱季谦 以下是笔者本人学习搭建docker过程当中记录的一些实践笔记&#xff0c;过程当中也遇到了一些坑&#xff0c;但都解决了&#xff0c;就此记录&#xff0c;留作以后再次搭建时可以直接参考。 一、首先&#xff0c;先检查CentOS版本&#xff0c;保证在CentOS7版本以…

2023食药物质产业发展大会12月在浙江绍兴隆重召开

为更好地推动食药物质行业高质量发展&#xff0c;推进食药物质相关产品的创新应用&#xff0c;促进行业科技进步&#xff0c;提高行业技术水平&#xff0c;中国生物发酵产业协会定于12月15-17日在浙江省绍兴市召开“2023食药物质产业发展大会暨中国生物发酵产业协会食药物质专业…

C# 使用执行cmd命令遇到俄语乱码处理

设置执行cmd命令的ProcessStartInfo对象编码使用System.Text.Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);注册更多字符编码。 通过上面的方式&#xff0c;如果把语言项的Beta版&#xff1a;使用Unicode UTF-8 提供全球语言支持的选择去掉则正常。但是该功…

LeetCode669. Trim a Binary Search Tree

文章目录 一、题目二、题解 一、题目 Given the root of a binary search tree and the lowest and highest boundaries as low and high, trim the tree so that all its elements lies in [low, high]. Trimming the tree should not change the relative structure of the …

Linux八股文

Linux八股文 第一章 Linux简介 Linux是一种多用户、多任务&#xff0c;支持多线程和多CPU的操作系统&#xff0c;具有免费、稳定、高效的优点&#xff0c;一般运行在大型服务器上。 1.1 常用目录 目录说明/根目录&#xff0c;有且仅有一个&#xff0c;一般只存放目录/home家目…

栈和队列知识点+例题

1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素的操作。进行数据插入和删除操作的一端成为栈顶&#xff0c;另一端成为栈底。遵守后进先出的原则&#xff08;类似于弹夹&#xff09; 压栈&#xff1a;栈的插入操…

C# 依赖注入IServiceCollection

在 C# 中&#xff0c;IServiceCollection 是 ASP.NET Core 中用于依赖注入的接口。依赖注入是一种设计模式&#xff0c;它允许对象之间的依赖关系由外部组件管理&#xff0c;而不是在对象内部直接创建它们的依赖项。IServiceCollection 接口用于注册和配置应用程序中的服务。 …