为了博多

为了博多

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
",sum-ans);
57     return 0;
58 }
View Code
原文地址:https://www.cnblogs.com/xzz_233/p/7212453.html