算法进阶指南图论 道路与航线

在这里插入图片描述

其实再次看这题的时候。想法就是和强连通分量有关,我们很容易发现,题目中所说的双向边,就构成了一个强连通分量,而所谓的单向边,则相当于把强连通分量进行缩点,然后整个图成为了一个DAG,众所周知,对于DAG,我们可以在O(n)的时间复杂度内处理很多东西,比如最短路,最长链等。而对于这题,我们并不需要求出其强连通分量,我们先只建出包含双向边的图,由此,整个图会分成若干个连通块,我们运用dfs去搜出每个连通块即可,对于每个连通块,我们可以使用dijk去求出其内部的最短路,然后对于外部,我们运用拓扑排序进行更新即可。

#include <bits/stdc++.h>

using namespace std;
const int N = 1e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 1e9+7;
// const int maxv = 4e6 + 5;
// #define endl "\n"

int n,r,p,s;

vector<pll> e[N];

void add(int u,int v,int w)
{
	e[u].push_back({v,w});
}

int st[N];
int bel[N];
int tot;
vector<int> vec[N];
void dfs(int x)
{
	st[x]=1;
	bel[x]=tot;
	vec[tot].push_back(x);
	for(auto [u,w] :e[x]){
		if(!st[u]){
			dfs(u);
		}
	}
}
int dr[N];
queue<int> q;
int vis[N],d[N];

void dijk(int x)
{
	priority_queue<pll,vector<pll>,greater<pll> > p;
	for(auto t: vec[x]){
		p.push({d[t],t});
	}
	while(!p.empty()){
		auto [dis,u]=p.top();
		p.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(auto [v,w] :e[u]){
			if(d[v]>d[u]+w){
				d[v]=d[u]+w;
				if(bel[v]==x){
					p.push({d[v],v});
				}
			}
			if(bel[v]!=x){
			     //cout<<bel[v]<<" ";
				if(dr[bel[v]]>0) dr[bel[v]]--;
				if(dr[bel[v]]==0) q.push(bel[v]);
			}

		}
	}
}

void solve()
{
	cin>>n>>r>>p>>s;
	for(int i=1;i<=r;i++){
		int a,b,c;
		cin>>a>>b>>c;
		add(a,b,c),add(b,a,c);
	}
	for(int i=1;i<=n;i++){
		if(!st[i]) {
			tot++;
			dfs(i);
		}
	}
	for(int i=1;i<=p;i++){
		int a,b,c;
		cin>>a>>b>>c;
		add(a,b,c);
		dr[bel[b]]++;
	}
	for(int i=1;i<=tot;i++){
	   // for(auto x: vec[i]) cout<<x<<" ";
		if(!dr[i]) q.push(i);
		//cout<<endl;
	}
	memset(d,0x3f,sizeof d);
	d[s]=0;
	while(!q.empty()){
		auto t=q.front();
		q.pop();
		dijk(t);
	}
	for(int i=1;i<=n;i++){
	   // cout<<d[i]<<" ";
		if(d[i]>0x3f3f3f3f/2) cout<<"NO PATH"<<endl;
		else cout<<d[i]<<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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

new Vue() 发生了什么

目录 前言: 原理: 代码: 用法: 总结: 相关资料: 前言: 在Vue.js中&#xff0c;当你创建一个新的Vue实例时&#xff0c;通过 new Vue() 发生了一系列重要的操作&#xff0c;包括Vue实例的初始化、数据绑定、模板编译等。这个过程是Vue应用的核心&#xff0c;本文将深入探…

可恶的 TCP 加速

中午有朋友给我发来一个图片&#xff0c;早期 TCP 规范起草人&#xff0c;david reed 老爷子气坏了&#xff1a; 互联网本是一个以合作而共赢的网络&#xff0c;结果被一群损人不利己的自私的家伙以无知的方式将这基本原则破坏掉了。 我没有能力如此言简意赅且优雅地喷(jerks…

【赠书第2期】嵌入式虚拟化技术与应用

文章目录 前言 1 背景概述 2 专家推荐 3 本书适合谁&#xff1f; 4 内容简介 5 书籍目录 6 权威作者团队 7 粉丝福利 前言 随着物联网设备的爆炸式增长和万物互联应用的快速发展&#xff0c;虚拟化技术在嵌入式系统上受到了业界越来越多的关注、重视和实际应用。嵌入式…

第八章《搞懂算法:逻辑回归是怎么回事》笔记

8.1 如何理解逻辑回归 逻辑回归根据给定的自变量数据集来估计事件的发生概率&#xff0c;由于结果是一个概率&#xff0c;因此因变量的范围在 0 和 1 之间。 逻辑回归的与线性回归一样&#xff0c;也是以线性函数为基础的&#xff1b;而与线性回归不同的是&#xff0c;逻辑回…

【广州华锐互动】VR影视制片虚拟仿真教学系统

随着虚拟现实(VR)技术的不断发展&#xff0c;VR在影视制片教学中的应用场景也变得越来越丰富。本文将介绍VR在影视制片教学中的常见应用场景及其意义&#xff0c;并通过案例分析来更好地展示其应用前景。 在影视制片教学中&#xff0c;VR可以提供一种沉浸式的制作体验。其中&am…

Unity 3D 调整cube的颜色

1.选中Assets后&#xff0c;右键->Create->Material 2.调整Material的颜色&#xff0c;然后将Material拖到对应的cube上

微头条项目实战:通过postman测试登录验证请求

1、CrosFilter package com.csdn.headline.filters; import jakarta.servlet.*; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; public class CrosFilter implements Filter {/*** 过滤器方法&#xff0c;用于处理HTTP请求* param servletReq…

【Orangepi Zero2 全志H616】驱动舵机控制 、Linux定时器(signal、setitimer)

一、SG90舵机开发 舵机基本介绍 二、Linux定时器 signal 函数setitimer 函数原型signal、setitimer函数API调用 三、舵机 软件PWM实现 一、SG90舵机开发 舵机基本介绍 如下图所示&#xff0c;最便宜的舵机sg90&#xff0c;常用三根或者四根接线&#xff0c;黄色为PWM信号控…

python爬虫(数据获取——双R)

静态资源加载 静态资源给了请求头和url即可 动态资源加载 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 } url "https://www.xinpianchang.com/api/xpc/comments/article…

flink的带状态的RichFlatMapFunction函数使用

背景 使用RichFlatMapFunction可以带状态来决定如何对数据流进行转换&#xff0c;而且这种用法非常常见&#xff0c;根据之前遇到过的某个key的状态来决定再次遇到同样的key时要如何进行数据转换&#xff0c;本文就来简单举个例子说明下RichFlatMapFunction的使用方法 RichFl…

智慧工地综合管理平台-项目整体需求规格说明书

引言 定位与目标 智慧工地是一种现代化的管理方式,目标是通过应用现代科技手段,对施工现场的设备、人员、物资等信息全面掌控,减少工地事故的发生,提高施工质量和安全性,同时也能够降低成本,提高效益,实现建筑施工的数字化、智能化和可持续发展,为城市建设和社会发展…

【STM32 PWM输出+串口调整PWM周期和占空比】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、PWM是什么&#xff1f;1. PWM 图解二、认识STM32的PWM功能1.哪些定时器有PWM输出功能1.1 高级定时器&#xff0c;7路PWM输出&#xff0c;3组是互补输出&…

0基础两小时建网站

​作者主页 &#x1f4da;lovewold少个r博客主页 ⚠️本文重点&#xff1a;0基础2小时搭建个人网站 &#x1f449;【C-C入门系列专栏】&#xff1a;博客文章专栏传送门 &#x1f604;每日一言&#xff1a;宁静是一片强大而治愈的神奇海洋&#xff01; 目录 前言 第一步 环境…

第12章 PyTorch图像分割代码框架-2

模型模块 本书的第5-9章重点介绍了各种2D和3D的语义分割和实例分割网络模型&#xff0c;所以在模型模块中&#xff0c;我们需要做的事情就是将要实验的分割网络写在该目录下。有时候我们可能想尝试不同的分割网络结构&#xff0c;所以在该目录下可以存在多个想要实验的网络模型…

11 # 手写 reduce 方法

reduce 使用 reduce() 方法对数组中的每个元素按序执行一个提供的 reducer 函数&#xff0c;每一次运行 reducer 会将先前元素的计算结果作为参数传入&#xff0c;最后将其结果汇总为单个返回值。 第一次执行回调函数时&#xff0c;不存在“上一次的计算结果”。如果需要回调…

运行obotframework-ride控制台报错module ‘urllib‘ has no attribute ‘Request‘

背景&#xff1a;Python3.8robotframework-ride1.7.3.1&#xff0c;运行报错module urllib has no attribute Request 原因&#xff1a; 解决&#xff1a;升级robotframework-ride到2.0以上。或者降级python到3.7。

基于SSM的演唱会购票系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是…

大数据学习之一文学会Spark【Spark知识点总结】

文章目录 什么是SparkSpark的特点Spark vs HadoopSparkHadoopSpark集群安装部署Spark集群安装部署StandaloneON YARN Spark的工作原理什么是RDDRDD的特点Spark架构相关进程Spark架构原理 Spark实战&#xff1a;单词统计Scala代码开发java代码开发任务提交 Transformation与Acti…

自动控制原理--面试问答题

以下文中的&#xff0c;例如 s_1 为 s下角标1。面试加油&#xff01; 控制系统的三要素&#xff1a;稳准快。稳&#xff0c;系统最后不能震荡、发散&#xff0c;一定要收敛于某一个值&#xff1b;快&#xff0c;能够迅速达到系统的预设值&#xff1b;准&#xff0c;最后稳态值…

清凉油市场现状及未来发展趋势

清凉油市场一直以其庞大的规模和快速增长的势头受到人们的关注。无论是消费者对健康生活方式的追求&#xff0c;还是中国作为全球最大市场的地位&#xff0c;都为清凉油市场的持续发展注入了强大的动力。随着人们对健康意识的提升和对保健产品需求的增加&#xff0c;清凉油市场…