问题
查看原帖
问题
322792
AlexandreLea楼主2021/8/23 21:19

最长SPFA不知道为啥错了

#include <bits/stdc++.h>
#define SIZE 100001
#define infinity 1000000001
using namespace std;
struct Edge{
    int from,to,dist;
    Edge(int u,int v,int d):from(u),to(v),dist(d){}
};
vector<Edge> all;
vector<int> starts[SIZE];
int n,m,d[SIZE];
void LinkEdge(int from,int to,int dist){
    all.push_back(Edge(from,to,dist));
    starts[from].push_back(all.size()-1);
    return;
}
void QueueBellmanFord(){
    queue<int> todeal;
    bool markin[SIZE]={};
    for(int i=1;i<=n;i++) d[i]=(i==1)?0:-infinity;
    todeal.push(1),markin[1]=true;
    while(!todeal.empty()){
        int from=todeal.front();
        todeal.pop(),markin[from]=false;
        for(auto num:starts[from]){
            int dist=all[num].dist,to=all[num].dist;
            if(d[from]<d[to]+dist){
                d[from]=d[to]+dist;
                if(!markin[to]){
                    todeal.push(to),markin[to]=true;
                }
            }
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        int c;
        cin>>c;
        LinkEdge(i,i+n,-c);
        LinkEdge(i+n,i+n*2,c);
    }
    for(int i=1;i<=m;i++){
        int x,y,z;
        cin>>x>>y>>z;
        LinkEdge(x,y,0);
        LinkEdge(x+n,y+n,0);
        LinkEdge(x+2*n,y+2*n,0);
        if(z==2){
            LinkEdge(y,x,0);
            LinkEdge(y+n,x+n,0);
            LinkEdge(y+2*n,y+2*n,0);
        }
    }
    QueueBellmanFord();
    cout<<max(d[n],d[n+2*n]);
    return 0;
}

2021/8/23 21:19
加载中...