玄学调试过的但不知道为什么,求解释
查看原帖
玄学调试过的但不知道为什么,求解释
467324
LuoMuxiaoxiao楼主2024/1/20 15:24

代码如下

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 5;

int n, m, f[N], l[N], e[N], tag[N];

vector<int> adja[N];

void dfs(int idx)
{
	if(tag[idx] >= 1) return;
	tag[idx]++;
	for(size_t i = 0; i < adja[idx].size(); i++) {
		if(l[adja[idx][i]] > l[idx]) {
			l[adja[idx][i]] = l[idx];
		}
		if(e[adja[idx][i]] < e[idx] || e[adja[idx][i]] < (f[adja[idx][i]] - l[adja[idx][i]])) {
			e[adja[idx][i]] = max(e[idx], f[adja[idx][i]] - l[adja[idx][i]]);
		}
		dfs(adja[idx][i]);
	}
}

int main()
{
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++) {
		scanf("%d", &f[i]);
		l[i] = f[i];
		//e[i] = 0; 
	}
	int u, v, z;
	for(int i = 0; i < m; i++) {
		scanf("%d%d%d", &u, &v, &z);
		adja[u].push_back(v);
		if(z == 2)
			adja[v].push_back(u);
	}
	
	dfs(1);
	
	printf("%d\n", e[n]);
	
	return 0;
} 

本来我的dfs函数是这样的:

void dfs(int idx)
{
	bool flag = false;
	for(size_t i = 0; i < adja[idx].size(); i++) {
		if(l[adja[idx][i]] > l[idx]) {
			l[adja[idx][i]] = l[idx];
			flag = true;
		}
		if(e[adja[idx][i]] < e[idx] || e[adja[idx][i]] < (f[adja[idx][i]] - l[adja[idx][i]])) {
			e[adja[idx][i]] = max(e[idx], f[adja[idx][i]] - l[adja[idx][i]]);
			flag = true;
		}
		if(flag) dfs(adja[idx][i]);
	}
}

不知道为什么在一个点对前文数据没有任何更新的情况下仍然需要从这个点向后进行搜索更新,不然无法到达点n 求dalao解释

2024/1/20 15:24
加载中...