为了博多
为了博多
Description
做了个噩梦,梦见我的 n 把刀到60级会二次变身,变成一个 对推6图有xi点贡献,刷大阪城有yi点贡献 的刀,于是要把刀分成两队一队刷大阪城另一队推6图 。
但是有m对兄弟刀在同一队会有特殊的buff加成,加成值为wi,问怎样分队收益最大,最大值是多少。
Input
第一行两个整数n(刀的数目)(0<=n<=20000),m(兄弟刀的对数)(0<=m<=200000)
接下来n行,每行两个整数xi,yi,分别表示第i把刀对推6图的贡献xi和对刷大阪城的贡献yi。
接下来m行,每行三个整数u,v,wi,分别表示第u把刀和第v把刀是兄弟刀,在一队能产生wi的buff值。
Output
一行一个数字,表示最大收益
Sample Input
3 1
1 10
2 10
10 3
2 3 1000
Sample Output
1023
Hint
Source
网络流,最大流
裸的最小割最大流(然而不是很理解),直接ADD(S,i,xi),(i,T,yi),(ui,vi,wi)就OK了
1 // It is made by XZZ 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 #define rep(a,b,c) for(rg int a=b;a<=c;a++) 7 #define drep(a,b,c) for(rg int a=b;a>=c;a--) 8 #define erep(a,b) for(rg int a=fir[b];a;a=nxt[a]) 9 #define il inline 10 #define rg register 11 #define vd void 12 #define t (dis[i]) 13 typedef long long ll; 14 il int gi(){ 15 rg int x=0;rg char ch=getchar(); 16 while(ch<'0'||ch>'9')ch=getchar(); 17 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); 18 return x; 19 } 20 const int maxn=20003,maxm=(maxn+800000)<<1,S=20001,T=20002; 21 int fir[maxn],nxt[maxm],dis[maxm],dep[maxn],id=1,head[maxn]; 22 ll w[maxm]; 23 il vd add(int a,int b,ll c=0){ 24 nxt[++id]=fir[a],fir[a]=id,dis[id]=b,w[id]=c; 25 if(c)add(b,a); 26 } 27 inline bool BFS() { 28 int que[maxn],hd=0,tl=1; 29 que[0]=S;bool yes[maxn]={0}; 30 yes[S]=1,dep[S]=0; 31 while(hd^tl) { 32 int now=que[hd]; 33 for(int i=fir[now]; i; i=nxt[i]) 34 if(w[i]>0&&!yes[t]) 35 yes[t]=1,que[tl++]=t,tl%=maxn,dep[t]=dep[now]+1; 36 ++hd,hd%=maxn; 37 } 38 return yes[T]; 39 } 40 inline ll Dinic(int now,ll h) { 41 if(now==T)return h; 42 int ans=0; 43 for(int&i=head[now]; i; i=nxt[i]) 44 if(w[i]>0&&dep[t]==dep[now]+1) { 45 int D=Dinic(t,min(h,w[i])); 46 w[i]-=D,w[i^1]+=D,ans+=D,h-=D; 47 if(h==0)return ans; 48 } 49 return ans; 50 } 51 int main(){ 52 rg int n=gi(),m=gi(),x,y,ww;rg ll ans=0,sum=0; 53 rep(i,1,n)x=gi(),y=gi(),sum+=x+y,add(S,i,(ll)x),add(i,T,(ll)y); 54 rep(i,1,m)x=gi(),y=gi(),ww=gi(),sum+=ww,add(x,y,(ll)ww),add(y,x,(ll)ww); 55 while(BFS())memcpy(head,fir,sizeof fir),ans+=Dinic(S,(ll)2333333); 56 printf("%lld\n",sum-ans); 57 return 0; 58 }
博主是蒟蒻,有问题请指出,谢谢!
本博客中博文均为原创,未经博主允许请勿随意转载,谢谢。
本博客中博文均为原创,未经博主允许请勿随意转载,谢谢。