头像

欢迎来到我的博客

分享题解与总结

P1807 最长路

image

思路:
本题是有向无环图(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

例子:
image

#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;
}
posted @ 2026-02-11 12:26  king_steph1209  阅读(5)  评论(0)    收藏  举报