很裸的题目,但是居然wa了几发,最后直接暴力替换int为long long过了,心塞。。。。。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#define LL long long
#define maxn 200021
using namespace std;
int head[1200],tot=1,n,m,q[maxn],h[maxn],vis[maxn],s,t,top,last[maxn];
LL ans,dis[maxn];
typedef pair<LL,LL>pii;
pii qq[maxn];
struct edge{int next,v;LL w;}e[maxn];
void insert(int a,int b,LL c){e[tot].v=b,e[tot].next=head[a],e[tot].w=c;head[a]=tot++;}
void adde(int a,int b,LL c){
e[tot].v=b,e[tot].w=c,e[tot].next=head[a];head[a]=tot++;
e[tot].v=a,e[tot].w=0,e[tot].next=head[b];head[b]=tot++;
}
void dijkstra(){
priority_queue<pii,vector<pii>,greater<pii> >q;
for(int i=1;i<=n;i++)dis[i]=1e17;
dis[1]=0;q.push(make_pair(0,1));
while(!q.empty()){
int u=q.top().second;q.pop();
if(vis[u])continue;
vis[u]=1;
for(int v,i=head[u];i;i=e[i].next){
v=e[i].v;
if(dis[v]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
q.push(make_pair(dis[v],v));
}
}
}
for(int i=1;i<=n;i++){
for(int j=head[i];j;j=e[j].next){
if(dis[e[j].v]==dis[i]+e[j].w)qq[++top]=make_pair(i,e[j].v);
}
}
}
bool bfs(){
int l=0,r=1;q[l]=s;
for(int i=1;i<=2*n;i++)h[i]=-1;h[s]=0;
while(l<r){
int u=q[l++];
for(int v,i=head[u];i!=-1;i=e[i].next)
if(h[v=e[i].v]==-1&&e[i].w){
h[v]=h[u]+1;
q[r++]=v;
}
}
return h[t]!=-1;
}
LL dfs(int u,LL f){
if(u==t)return f;
LL used=0,w;
for(int v,i=last[u];i!=-1;i=e[i].next)
if(h[v=e[i].v]==h[u]+1&&e[i].w){
last[u]=i;
w=min(f-used,e[i].w);
w=dfs(v,w);
used+=w;e[i].w-=w,e[i^1].w+=w;
if(used==f)return used;
}
if(!used)h[u]=-1;
return used;
}
void dinic(){
while(bfs()){
for(int i=1;i<=2*n;i++)last[i]=head[i];
ans+=dfs(s,1e17);
}
printf("%lld",ans);
}
void build(){
tot=0;memset(head,-1,sizeof(head));s=1+n,t=n;
LL x;
for(int i=1;i<=n;i++){
scanf("%lld",&x);
adde(i,i+n,x);
}
for(int i=1;i<=top;i++)
adde(qq[i].first+n,qq[i].second,1e17);
}
int main(){
scanf("%d%d",&n,&m);LL c;
for(int a,b,i=1;i<=m;i++){
scanf("%d%d%lld",&a,&b,&c);
insert(a,b,c),insert(b,a,c);
}
dijkstra();
build();
dinic();
return 0;
}