//bellman 算法,主要是可以判断是不是有负权回路;
//差分约束的问题
#include<iostream> #include<string.h> #include<cmath> #include<stdio.h> using namespace std; #define inf 0x7ffffff #define maxn 23000 int dist[maxn]; int c[maxn]; int d[maxn]; int ei; int n,m; struct eg { int u; int v; int w; }edges[maxn]; void init() { ei=0; int i; for(i=0;i<=n;i++) { dist[i]=inf; } d[0]=0; dist[n]=0; } bool bellman() { int i,k,t; for(i=0;i<n;i++) { for(k=0;k<ei;k++) { t=dist[edges[k].u]+edges[k].w; if(dist[edges[k].u]!=inf&&t<dist[edges[k].v]) { dist[edges[k].v]=t; } } } for(k=0;k<ei;k++)//判断是不是有负权回路 { if(dist[edges[k].u]!=inf&&dist[edges[k].u]+edges[k].w<dist[edges[k].v]) return false; } return true; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { init(); int i,u,v,w; for(i=1;i<=n;i++)//一些不等式 { scanf("%d",&c[i]); edges[ei].u=i-1; edges[ei].v=i; edges[ei].w=c[i]; ei++; edges[ei].u=i; edges[ei].v=i-1; edges[ei].w=0; ei++; d[i]=c[i]+d[i-1]; } for(i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); edges[ei].u=v; edges[ei].v=u-1; edges[ei].w=-w; ei++; edges[ei].u=u-1; edges[ei].v=v; edges[ei].w=d[v]-d[u-1]; ei++; } if(!bellman()) printf("Bad Estimations\n"); else printf("%d\n",dist[n]-dist[0]); } return 0; }