题解 P1807 【最长路_NOI导刊2010提高(07)】

· · 题解

裸的拓扑 用一个标记数组,只有从1号点能到的的点才回更新最大路 跑一遍 OK啦

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const int M=500500;
int ind[M]={0};
int maxa[M]={0};
int n,m,i,j;
struct edge
{
    int from;
    int to;
    int cost;   
};
int bj[M]={0};
vector<edge>G[M];
int TopSort()
{
    int tot=0;
    queue<int>q;
    for (i=1;i<=n;i++)
        if (ind[i]==0)
            q.push(i);
    while (q.size())
    {
        int u=q.front();
        q.pop();
        for (i=0;i<G[u].size();i++)
        {
            ind[G[u][i].to]--;
            if (bj[u]==1)
            {
                if (maxa[G[u][i].to]<maxa[u]+G[u][i].cost) maxa[G[u][i].to]=maxa[u]+G[u][i].cost;
                bj[G[u][i].to]=1;
            }
            if (ind[G[u][i].to]==0) 
                q.push(G[u][i].to);
        }
    }
    return tot;
}
int main()
{
    scanf("%d %d",&n,&m);
    for (i=1;i<=m;i++)
    {
        edge now;
        scanf("%d %d %d",&now.from,&now.to,&now.cost);
        ind[now.to]++;
        G[now.from].push_back(now);
    }
    maxa[n]=-1;bj[1]=1;
    TopSort();
    cout<<maxa[n]<<endl;
    return 0;
}