【洛谷】AT_abc373_c [ABC373D] Hidden Weights 的题解

news/2024/10/3 14:18:16 标签: c语言, 深度优先, 开发语言, c++, 算法

【洛谷】AT_abc373_c [ABC373D] Hidden Weights 的题解

洛谷传送门

AT传送门

题解

本地WA,提交AC,奇迹 AT,奇迹评测机

题目大意:

给定 n n n 个点, m m m 条有向边,每条有向边从 u i u_i ui 指向 v i v_i vi,边权为 w i w_i wi。构造一个长度为 n n n 的整数序列 x x x,满足: x v j − x u j = w j x_{v_j}−x_{u_j}=w_j xvjxuj=wj

一个简单的 DFS?也不知道该叫啥qaq

注意到数据保证有解,因此一定有多组的解(在某组解上同时加或减一个数,差显然不变),构造起来也比较容易。直接遍历全图,对于当前的第
j j j 条边,若 v j v_j vj 未遍历,则令 x v j ← x u j + w j x_{v_j}\gets x_{u_j} + w_j xvjxuj+wj 即可,并遍历 v j v_j vj

对于图的每个连通分量,一旦在其中任何顶点上的值固定,则所有写入的值都是确定的。

我们可以逐个 DFS 每个连通分量,按照题目的要求给每个点赋值,初始搜索的点值设成 0 0 0 即可。

不开 long long 见祖宗,C题刚被坑,D题学乖了

代码

#include <bits/stdc++.h>
#define lowbit(x) x & (-x)
#define endl "\n"
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
namespace fastIO {
	inline int read() {
		register int x = 0, f = 1;
		register char c = getchar();
		while (c < '0' || c > '9') {
			if(c == '-') f = -1;
			c = getchar();
		}
		while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
		return x * f;
	}
	inline void write(int x) {
		if(x < 0) putchar('-'), x = -x;
		if(x > 9) write(x / 10);
		putchar(x % 10 + '0');
		return;
	}
}
using namespace fastIO;
struct edge {
	ll v, w, nextt;
}e[1000005];
ll n, m, head[1000005], vis[1000005], ans[1000005], tot; 
void dfs(int u) {
	vis[u] = 1;
	int v;
	for(int i = head[u]; i; i = e[i].nextt) {
		v = e[i].v;
		if(vis[v]) {
			continue;
		}
		ans[v] = ans[u] + e[i].w;
		dfs(v);
	}
	return;
}
void add(int u, int v, int w) {
	tot ++;
	e[tot].v = v;
	e[tot].w = w;
	e[tot].nextt = head[u];
	head[u] = tot;
	return;
}
int main() {
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(ll i = 1; i <= m; i ++) {
		ll u, v, w;
		cin >> u >> v >> w;
		add(u, v, w);
		add(v, u, -w);
	}
	for(ll i = 1; i <= n; i ++) {
		if(!vis[i]) {
			dfs(i);
		}
	}
	for(ll i = 1; i <= n; i ++) {
		cout << ans[i] << " ";
	}
	return 0;
}

http://www.niftyadmin.cn/n/5688508.html

相关文章

激光切割机适用材质有哪些

激光切割机是一种利用激光束对各种材料进行高精度、高速度切割的机器设备。其适用材质广泛&#xff0c;包括但不限于以下两大类&#xff1a; 一、金属材料 不锈钢&#xff1a;激光切割机较容易切割不锈钢薄板&#xff0c;使用高功率YAG激光切割系统&#xff0c;切割不锈钢板的…

rabbitMq------客户端模块

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言消费者模块信道管理模块管理的字段提供的接口 信道内存管理连接管理类 前言 在RabbitMQ中&#xff0c;提供服务的是信道&#xff0c;因此在客⼾端的实现中&…

数据结构--包装类简单认识泛型

目录 1 包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱&#xff0c;自动装箱和自动拆箱 2 什么是泛型 3 引出泛型 3.1 语法 4 泛型类的使用 4.1 语法 4.2 示例 5 泛型的上界 5.1 语法 5.2 示例 5.3 复杂示例 8 泛型方法 8.1 定义语法 8.2 示例 总结 1 …

C语言_内存函数

内存函数是 C 标准库中的一组函数&#xff0c;用于管理和操作内存。使用时需要包含头文件<string.h>。 1. memcpy的使用和模拟实现 函数形式如下&#xff1a; void* memcpy(void* destination, const void* source, size_tnum);函数解析和注意事项&#xff1a; memcp…

二、创建drf纯净项目

1)创建项目 django-admin startproject api2&#xff09;创建app django-admin startproject api_app3)修改settings.py注释掉一些没用的配置 INSTALLED_APPS [# django.contrib.admin,# django.contrib.auth,# django.contrib.contenttypes,# django.contrib.sessions,# d…

VScode 自定义代码配色方案

vscode是一款高度自定义配置的编辑器, 我们来看看如何使用它自定义配色吧 首先自定义代码配色是什么呢? 看看我的代码界面 简而言之, 就是给你的代码的不同语义(类名, 函数名, 关键字, 变量)等设置不同的颜色, 使得代码的可读性变强. 其实很多主题已经给出了定制好的配色方案…

FastGPT的使用

fastGPT的介绍&#xff1a; fastGPT其实和chatGPT差不多 但是好处是可以自行搭建&#xff0c;而且很方便 链接&#xff1a;https://cloud.fastgpt.cn/app/list 首先我们可以根据红框点击&#xff0c;创建一个简易的对话引导 这个机器人就非常的简易&#xff0c;只能完成一些翻…

学生Schutte情绪智力测评

情绪智力(Emotional Intelligence,EI)作为衡量个体在情绪处理、理解和运用方面的能力,近年来在心理学和教育领域得到了广泛关注。Schutte情绪智力量表(Schutte Self-report Emotional Intelligence Scale,SSEIS)作为其中一种常用的测评工具,为高中学生提供了全面评估自…