题目链接:https://codeforces.com/gym/102021/attachments
题意:给你带非负边权的 D A G DAG DAG图,你需要得到最长路。
解题心得:就是一个 D A G DAG DAG求最长路的简单 d p dp dp。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int n, m, in_degree[maxn], dp[maxn], Max;
vector <pair<int, int> > ve[maxn];
void init() {
scanf("%d%d",&n, &m);
for(int i=1;i<=m;i++) {
int a, b, c;
scanf("%d%d%d",&a, &b, &c);
ve[a].push_back({b, c});
in_degree[b]++;
}
}
void DAG() {
queue <int> qu1, qu2;
for(int i=1;i<=n;i++) {
if(in_degree[i] == 0) qu1.push(i);
}
while(!qu1.empty()) {
while(!qu1.empty()) {
int now = qu1.front(); qu1.pop();
for(int i=0;i<ve[now].size();i++) {
int v = ve[now][i].first;
int sp = ve[now][i].second;
dp[v] = max(dp[v], dp[now] + sp);
Max = max(Max, dp[v]);
in_degree[v]--;
if(in_degree[v] == 0) qu2.push(v);
}
}
while(!qu2.empty()) {
qu1.push(qu2.front());
qu2.pop();
}
}
}
int main() {
// freopen("1.in.txt", "r", stdin);
init();
DAG();
printf("%d\n", Max);
return 0;
}