最长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;
}