最长路

题目链接:https://www.luogu.com.cn/problem/P1807

题意:

求1~n之间的最长路

思路:

将所有边权变为负边权,跑spfa最短路可得-最长距离

int n,m;
struct edge{
	int v,w;
};
vector<edge>e[maxn];
int d[maxn],cnt[maxn],vis[maxn];
void spfa(int s){
	queue<int>q;
	rep(i,1,n)d[i]=llmax;
	
	d[s]=0;
	vis[s]=1;q.push(s);
	while(!q.empty()){
		int u=q.front();q.pop();vis[u]=0;
		for(auto ed:e[u]){
			int v=ed.v,w=ed.w;
			if(d[v]>d[u]+w){
				d[v]=d[u]+w;
				cnt[v]=cnt[u]+1;
//				if(cnt[v]>=n)return true;
				if(!vis[v]){
					q.push(v);vis[v]=1;
				}
			}
		}
	}
}
void solve(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,w;cin>>u>>v>>w;
		e[u].pb({v,-w});
	}
	int s=1;
	
	spfa(s);
	if(d[n]==llmax){
		cout<<-1<<endl;return;
	}
	cout<<-d[n]<<endl;
}
posted @ 2025-04-05 15:17  Marinaco  阅读(16)  评论(0)    收藏  举报
//雪花飘落效果