56pts,拓扑排序求助
  • 板块P1807 最长路
  • 楼主qqqqq111
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/5/24 22:17
  • 上次更新2023/10/28 00:41:02
查看原帖
56pts,拓扑排序求助
313137
qqqqq111楼主2022/5/24 22:17

rt,f[x]代表从1到x的最长路长度

#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>

#define ll long long
#define N 1505
#define M 50005

namespace IO {
    inline ll rad() {
        char c=getchar();
        ll f=1, x=0;
        while(c<'0' || c>'9') {
            if(c=='-')
                f=-1;
            c=getchar();
        }
        while(c>='0' && c<='9') {
            x=(x<<1)+(x<<3)+c-'0';
            c=getchar();
        }
        return x*f;
    }
    void write(ll x) {
        if(x<0) {
            x=-x;
            putchar('-');
        }
        if(x>9)
            write(x/10);
        putchar(x%10+'0');
    }
}

using namespace IO;

std::queue<int> q;
int n, m;
int ind[N];
int f[N];
struct node {
    int to, nxt, w;
}edge[M];
int head[N], tot;

void add_edge(int u, int v, int w) {
    edge[++tot]={v, head[u], w};
    head[u]=tot;
}

int main() {
    n=rad(), m=rad();
    while(m--) {
        int u=rad(), v=rad(), w=rad();
        add_edge(u, v, w);
        ind[v]++;
    }
    for(int i=1; i<=n; i++) {
        if(!ind[i])
            q.push(i);
    }
    while(!q.empty()) {
        int x=q.front();
        q.pop();
        for(int i=head[x]; i; i=edge[i].nxt) {
            int v=edge[i].to;
            f[v]=std::max(f[v], f[x]+edge[i].w);
            ind[v]--;
            if(!ind[v])
                q.push(v);
        }
    }
    printf("%d\n", f[n]);
    return 0;
}
2022/5/24 22:17
加载中...