1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #include<iostream> #include<cstdio> #include<algorithm> #include<cctype> #include<cstring> #include<cmath> #include<queue> using namespace std; inline int read(){ int w=0,x=0;char c=getchar(); while(!isdigit(c))w|=c=='-',c=getchar(); while(isdigit(c))x=x*10+(c^48),c=getchar(); return w?-x:x; } namespace star { const int maxn=3005,maxm=600005,S=3003,T=3004,INF=0x3f3f3f3f; int n,m; int ecnt=1,head[maxn],to[maxm],nxt[maxm],w[maxm],v[maxm]; inline void addedge(int a,int b,int c,int d){ to[++ecnt]=b,nxt[ecnt]=head[a],head[a]=ecnt,w[ecnt]=c,v[ecnt]=d; to[++ecnt]=a,nxt[ecnt]=head[b],head[b]=ecnt,w[ecnt]=0,v[ecnt]=-d; } int dis[maxn],pre[maxn]; bool vis[maxn]; inline bool spfa(){ queue<int> q; memset(pre,0,sizeof pre); memset(vis,0,sizeof vis); memset(dis,INF,sizeof dis); q.push(S);dis[S]=0; while(!q.empty()){ int x=q.front();q.pop(); vis[x]=false; for(int u,i=head[x];i;i=nxt[i]) if(dis[u=to[i]]>dis[x]+v[i] and w[i]){ dis[u]=dis[x]+v[i];pre[u]=i; if(!vis[u]) vis[u]=true,q.push(u); } } return pre[T]; } int a[maxn]; inline void work(){ n=read(),m=read(); for(int i=1;i<=n;i++) addedge(S,i,1,0),addedge(i+n,T,1,0),addedge(S,i+n,1,a[i]=read()); for(int u,v,zp,i=1;i<=m;i++){ u=read(),v=read(); if(u>v) swap(u,v); if((zp=read())<a[v])addedge(u,v+n,1,zp); } int ans=0; while(spfa()){ int mn=INF; for(int i=pre[T];i;i=pre[to[i^1]]) mn=min(mn,w[i]); for(int i=pre[T];i;i=pre[to[i^1]]) w[i]-=mn,w[i^1]+=mn; ans+=dis[T]*mn; } printf("%d\n",ans); } } signed main(){ star::work(); return 0; }
|