社区讨论

dfs能AC,但题解里没有用dfs的,是数据太水吗?

P1807最长路参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo144q5t
此快照首次捕获于
2023/10/22 14:53
2 年前
此快照最后确认于
2023/11/02 14:25
2 年前
查看原帖
很久之前AC的代码,刚试了一下还是能A掉。但是现在重新看题目,感觉这个数据范围是不能dfs的。
CPP
#include <algorithm>
#include <queue>
#include <cstdio>
#include <vector>
using namespace std;

const int MAXN = 1505;
const int MAXM = 50005;

struct Edge{
	int to;
	int v;
};

bool operator < (const Edge& e1, const Edge& e2){
	return e2.v < e1.v;
}

int N, M;
vector<Edge> A[MAXN];
long long mark[MAXN];
long long ans = -1800000000000000000LL;

void dfs(int n, long long v){
	if(N == n) {
		if(v > ans) ans = v; // 更新ans
		return;
	}
	if(mark[n] != 0 && mark[n] >= v) return;
	mark[n] = v;
	
	for(auto& e: A[n]){
		dfs(e.to, v + e.v);
	}
}


// 核心思路:邻接表按边权从大到小排序,对图做dfs,优先访问较长边。
int main(){
	scanf("%d%d", &N, &M);
	for(int i=1; i<=M; i++){
		int a,b,v;
        scanf("%d%d%d", &a, &b, &v);
		Edge e; e.to = b; e.v = v;
		A[a].push_back(e);
	}
	
	for(int i=1; i<=N; i++){
		sort(A[i].begin(), A[i].end());
	}
	
	dfs(1, 0);
	
	if(ans == -1800000000000000000LL) printf("-1");
	else printf("%lld", ans);

    return 0; 
}

回复

5 条回复,欢迎继续交流。

正在加载回复...