感觉思路挺清晰的,就是过不了,调了好久,求大佬助我脱离苦海
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=1510000,inf=2147483647;
int n,m,a[maxn],cnt=0;
int h[maxn],to[maxn],val[maxn],nxt[maxn],dis[maxn];
bool vis[maxn];
void add(int a,int b,int c)
{
to[++cnt]=b;
val[cnt]=c;
nxt[cnt]=h[a];
h[a]=cnt;
}
queue<int>q;
void spfa()
{
for(int i=1;i<=3*n;i++)
{
dis[i]=inf;
}
dis[1]=0;vis[1]=1;q.push(1);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=h[u];i;i=nxt[i])
{
if(dis[to[i]]>(long long)dis[u]+val[i])
{
dis[to[i]]=dis[u]+val[i];
if(!vis[to[i]])
{
q.push(to[i]);
vis[to[i]]=1;
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",a[i]);
add(i,i+n,a[i]);
add(i+n,i+2*n,-a[i]);
}
for(int i=1,u,v,w;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
if(w==1)
{
add(u,v,0);
add(u+n,v+n,0);
add(u+2*n,v+2*n,0);
}
else
{
add(u,v,0);
add(u+n,v+n,0);
add(u+2*n,v+2*n,0);
add(v,u,0);
add(v+n,u+n,0);
add(v+2*n,u+2*n,0);
}
}
spfa();
int ans=inf;
for(int i=1;i<=n;i++)
{
ans=min(dis[2*n+i],ans);
}
cout<<-ans;
return 0;
}