1 条题解

  • 0
    @ 2026-11-15 15:00:00

    最长路SPFA写法

    #include <bits/stdc++.h>
    #define int long long//开long long 
    using namespace std;
    const int N=5e4+5;
    const int inf=2147483647;
    int n,m;
    struct edge{
    	int to;
    	int w;
    };
    vector<edge>G[N];
    bool vis[N];
    int dis[N];
    void spfa(int s){//有正边权用SPFA 
    	for(int i=1;i<=n;i++)dis[i]=-inf;//注意:最长路要初始化为无穷小 
    	queue<int>q;
    	vis[s]=1;
    	dis[s]=0;
    	q.push(s);//初始化 
    	while(!q.empty()){
    		int now=q.front();
    		q.pop();
    		vis[now]=0;//now不在队列中 
    		for(auto x:G[now]){
    			int nex=x.to;
    			int val=x.w;
    			if(dis[now]+val>dis[nex]){//注意:最长路用">" 
    				dis[nex]=dis[now]+val;
    				if(vis[nex])continue;
    				vis[nex]=1;
    				q.push(nex);
    			}
    		}
    	}
    }	
    signed main(){
    	cin>>n>>m;
    	for(int i=1;i<=m;i++){
    		int u,v,w;
    		cin>>u>>v>>w;
    		G[u].push_back({v,w});
    	}
    	spfa(1);
    	if(dis[n]==-inf)cout<<-1;//如果为负无穷,输出-1 
    	else cout<<dis[n];
    	return 0;
    }
    
    

    信息

    ID
    1194
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者