原来感觉Dinic超级难。。去看了下洛谷的模板题当初竟然还是贺的。。。
然而今天竟然1A了……
#include<bits/stdc++.h>
using namespace std;
const int N=60001;
const int M=500001;
const int INF=2e9;
int n,m;
int cnt=-1,Next[M],v[M],w[M],head[N];
int dep[N],cur[N];
int ans;
queue<int> h;
void read(int &x){
char ch=getchar();x=0;int w=1;
for(;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') w=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
x*=w;
}
inline void add_edge(int x,int y,int z){
Next[++cnt]=head[x];
head[x]=cnt;
v[cnt]=y;
w[cnt]=z;
}
inline void add(int x,int y,int z){
add_edge(x,y,z);
add_edge(y,x,0);
}
int dfs(int x,int d){
if (x==n) return d;
for(int &i=cur[x];i!=-1;i=Next[i])
if (dep[v[i]]==dep[x]+1&&w[i]){
int dd=dfs(v[i],min(d,w[i]));
if (dd){
w[i]-=dd;
w[i^1]+=dd;
return dd;
}
}
return 0;
}
int bfs(){
h.push(0);
memset(dep,0,sizeof dep);
dep[0]=1;
while(!h.empty()){
int x=h.front();h.pop();
for(int i=head[x];i!=-1;i=Next[i])
if (w[i]&&dep[v[i]]==0){
dep[v[i]]=dep[x]+1;
h.push(v[i]);
}
}
return dep[n];
}
void dinic(){
while(bfs()){
for(int i=0;i<=n;i++) cur[i]=head[i];
int d;
while(d=dfs(0,INF))
ans+=d;
}
}
int main(){
read(n);read(m);
int x,y,z;
memset(head,-1,sizeof head);
for(int i=1;i<=n;i++){
read(x);
add(m+i,m+n+1,x);
}
int s=0;
for(int i=1;i<=m;i++){
read(x);read(y);read(z);
s+=z;
add(0,i,z);
add(i,x+m,INF);
add(i,y+m,INF);
}
n=n+m+1;
dinic();
cout<<s-ans<<endl;
return 0;
}