zoukankan      html  css  js  c++  java
  • 为了博多

    为了博多

    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
  • 相关阅读:
    php 高并发
    mysql 基础明细
    关于高并发和秒杀系统,你知道的和不知道的一些事
    carbon
    自定义tarbar
    学习小参考
    lnmp1.4,400,500,错误
    PHPSTORM+Thinkphp3.2模板标签替换Thinkphp5.1公式
    Thinkphp5.1手册太简单,有的功能用起来不确定结果是否和预料的一样,顾整理记录
    CentOS7 最小化安装vmware-tools
  • 原文地址:https://www.cnblogs.com/xzz_233/p/7212453.html
Copyright © 2011-2022 走看看