相当与一个拓扑排序的模板题吧

蒟蒻的辛酸史

洛谷 P1807 最长路_NOI导刊2010提高(07)题解

 

 

 

 题目大意:给你一个有向无环图,让你求出1到n的最长路,如果没有路径,就输出-1

 

思路:一开始以为是一个很裸的拓扑排序

就不看题目,直接打了一遍拓扑排序

然后就得到了45分的成绩

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#define int long long int 

using namespace std;

struct node
{
    int u;
    int v;
    int w;
    int next;
}data[1000010];
int head[1000010];
int cnt;
int n,m;

inline void add(int u,int v,int w)
{
    cnt++;
    data[cnt].v=v;
    data[cnt].w=w;
    data[cnt].next=head[u];
    head[u]=cnt;
}

queue<int> q;
int fl[1000010];
int value[1000010];

signed main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
        fl[v]++;
    }
    for(int i=1;i<=n;i++)
    {
        if(fl[i]==0)
        {
            q.push(i);
        }
    }
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        for(int i=head[x];i;i=data[i].next)
        {
            if(value[data[i].v]<value[x]+data[i].w)
            {
                value[data[i].v]=value[x]+data[i].w;
            }
            fl[data[i].v]--;
            if(!fl[data[i].v])
            {
                q.push(data[i].v);
            }
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        ans=max(ans,value[i]);
    }
    cout<<ans<<endl;
    return 0;
    
}
45分代码

相关文章: