首先有负权,其次求的是最长路。
这里放一下我侏罗纪时期写的使山代码:
#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
const int N=1510,M=50100;
int n,m,g,k;
int d[N],nbs[N];
bool v[N];
struct edge{
int ed,next;
int w;
}a[M];
void add(int x,int y,int z){
g++;
a[g].ed=y;
a[g].next=nbs[x];
a[g].w=z;
nbs[x]=g;
return;
}
void init(){
int fr,to,len;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&fr,&to,&len);
add(fr,to,len);
}
return;
}
void dijk(){
for(int i=1;i<=n;i++)
d[i]=-inf;
d[1]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
if(!v[j]){
k=j;
break;
}
v[k]=1;
int x=nbs[k];
while(x){
if(!v[a[x].ed])
d[a[x].ed]=max(d[a[x].ed],d[k]+a[x].w);
x=a[x].next;
}
}
}
signed main(){
init();
dijk();
if(d[n]==-inf)printf("-1");
else printf("%d",d[n]);
return 0;
}