D - Hidden Weights

题目链接:

D - Hidden Weights (atcoder.jp)

题目描述:

数据范围限制:

样例:

输入:

3 3

1 2 2

3 2 3

1 3 -1

输出:

3 5 2

样例图:

思路:

第一次想的是从没有入节点的点去出发,然后去依次去更新,但是发现这个是错误的。

用dfs去暴力搜索,也就是去遍历点。遍历过的点就标记为true,遍历到当前这个点的时候,这个点的后面的点也就会遍历,因此没有必要去重复标记。

注意:在加入点的时候 add(x, y, z) 和 add(y, x, -z) 因为 x到y的距离是z,那么反过来就是-z 。为什么要加第二个add呢?要是不加的话dfs() 的时候标记为true,那么后面再去由其他的点遍历到当前这个点的时候,发现为true就不能再去更新了。例如下面这张图,要是不去add(y, x, -z) 的话, 那么在for(int i = 1; i <= n; i ++ ) i=1的时候发现ok1 = false 然后去dfs,把其标记为true, 然后for的时候发现它没有指向别的边,当遍历到2的时候,发现2的下面有个1,尝试着去更新1的时候,发现1已经被标记为true了,怎么去更新?要是加入add(y, x, -z) 的话就相当于是个双向图了,但是权值是相反的,不过也没事,每个点遵循的原则是:只去更新一次。

这个add两次的这个方法在之前是见过的,但是没想到,我用的是类似与bfs的方法,但是这样是会发生冲突的,用dfs这个不撞南墙不回头的精神,因为答案必存在,那么任何一个起点都是可以的,不会发生冲突。

代码:

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
 
using namespace std;

const int N = 2e5 + 10;

vector<pair<int, int> > v[N];
int n, m;
int ret[N];
int ok[N];

// 这样确实会一个点去遍历一次 
void dfs(int x) {
	cout << "x = " << x << endl ;
	ok[x] = true;
	for(auto i : v[x]) {
		//cout << "i = " << i.fi << endl;
		if(!ok[i.fi]) { // 还没有被更新 
			ret[i.fi] = ret[x] + i.se;
		//	cout << "i.fi = " << i.fi << endl;
			dfs(i.fi);;
		}
	}
}

signed main() {
	cin >> n >> m;
	for(int i = 1; i <= m; i ++ ) {
		int x, y, z;
		cin >> x >> y >> z;
		v[x].push_back({y, z});
		v[y].push_back({x, -z}); // 这个是必须要写的
		// 解决了先后的问题 
	}
	
	for(int i = 1; i <= n; i ++ ) {
		if(!ok[i])
		dfs(i);
	}
	
	for(int i = 1; i <= n; i ++ ) {
		cout << ret[i] << " ";
	}
	
	return 0;
}

运行结果:

相关推荐
布莱克6051 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
ZhengEnCi3 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是3 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考4 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
沫璃染墨6 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
nm_zfyjt6 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
xiaoye-duck7 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
w_zero_one7 小时前
算法--构造
java·数据结构·算法
其实防守也摸鱼7 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php
旖旎夜光8 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习