P1807 最长路

思路:
本题是有向无环图(DAG)上的最长路径问题。
dist[v]=max(dist[v],dist[u]+w(u,v))
步骤:
1.输入,统计每一个点的入度
2.初始化dist[i],dist[i]记录:从1->i的最长路径的长度值
3.拓扑排序,以保证处理dist[v]时,所有可以直达v的 dist[u] 已经是1->u的最长路径
4.用拓扑序列松弛每一条出边,假设当前u1=tp[i],则松弛u1的每一条出边(u1->v1),更新dist[v1]的值
5.输出,若dist[n]=INT_MIN,则为-1
例子:

#include<bits/stdc++.h>
#define MAXN 1505
using ll=long long;
using namespace std;
struct node{ll v,w;};
ll n,m,a,b,c,indegree[MAXN],dis[MAXN],ans;
vector<node> e[MAXN];
vector<ll> tp;
void toposort()
{
queue<int> q;
ll u1,v1;
for(ll i=1;i<=n;++i)
if(indegree[i]==0) q.push(i);
while(!q.empty()){
u1=q.front(); q.pop();
tp.push_back(u1);
for(auto node1:e[u1]){
v1=node1.v;
if(--indegree[v1]==0) q.push(v1);
}
}
}
void calc()
{
ll u1,v1,w1;
dis[1]=0;
for(ll i=0;i<n;++i){
u1=tp[i];
for(auto node1:e[u1]){
v1=node1.v,w1=node1.w;
dis[v1]=max(dis[v1],dis[u1]+w1);
}
}
}
int main()
{
cin>>n>>m;
for(ll i=1;i<=m;++i)
{
scanf("%lld %lld %lld",&a,&b,&c);
e[a].push_back({b,c});
indegree[b]++;
}
for(ll i=1;i<=n;++i)
dis[i]=INT_MIN;
toposort();
calc();
if(dis[n]==INT_MIN) cout<<-1;
else cout<<dis[n];
return 0;
}

浙公网安备 33010602011771号