社区讨论
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 条回复,欢迎继续交流。
正在加载回复...