zoukankan      html  css  js  c++  java
  • bzoj 3876: [Ahoi2014]支线剧情

     就是加一个1的下界就好了。

     1 #include<bits/stdc++.h>
     2 #define N 100005
     3 #define LL long long
     4 #define inf 0x3f3f3f3f
     5 #define ls tr[x][0]
     6 #define rs tr[x][1]
     7 using namespace std;
     8 inline int ra()
     9 {
    10     int x=0,f=1; char ch=getchar();
    11     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    12     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    13     return x*f;
    14 }
    15 struct node{
    16     int c,v,from,to,next;
    17 }e[N];
    18 int tot=1,ans,from[N],n,m,S,T,head[N],cnt,dis[N],q[N<<1];
    19 bool inq[N];
    20 void ine(int x, int y, int v, int c)
    21 {
    22     e[++tot].to=y; e[tot].next=head[x]; head[x]=tot;
    23     e[tot].v=v; e[tot].c=c; e[tot].from=x;
    24 }
    25 void insert(int x, int y, int c, int v)
    26 {
    27     ine(x,y,v,c); ine(y,x,-v,0);
    28 }
    29 bool spfa()
    30 {
    31     for (int i=1; i<=n+2; i++) dis[i]=inf;
    32     int l=0,r=1; q[0]=S; dis[S]=0; inq[S]=1;
    33     while (l<r)
    34     {
    35         int x=q[l++];
    36         for (int i=head[x];i;i=e[i].next)
    37             if (dis[e[i].to]>dis[x]+e[i].v && e[i].c)
    38             {
    39                 dis[e[i].to]=dis[x]+e[i].v;
    40                 from[e[i].to]=i;
    41                 if (!inq[e[i].to])
    42                 {
    43                     inq[e[i].to]=1;
    44                     q[r++]=e[i].to;
    45                 }
    46             }
    47         inq[x]=0;
    48     }
    49     if (dis[T]==inf) return 0;
    50     return 1;
    51 }
    52 void mcf()
    53 {
    54     int x=inf;
    55     for (int i=from[T];i;i=from[e[i].from]) x=min(x,e[i].c);
    56     for (int i=from[T];i;i=from[e[i].from]) ans+=x*e[i].v,e[i].c-=x,e[i^1].c+=x;
    57 }
    58 void fyl()
    59 {
    60     while (spfa()) mcf();
    61 }
    62 int main()
    63 {
    64     n=ra();
    65     S=n+1; T=n+2;
    66     for (int i=1; i<=n; i++)
    67     {
    68         int cnt=ra();
    69         insert(i,T,cnt,0);
    70         if (i!=1) insert(i,1,inf,0);
    71         for (int j=1; j<=cnt; j++)
    72         {
    73             int x=ra(),v=ra();
    74             insert(S,x,1,v);
    75             insert(i,x,inf,v);
    76         }
    77     }
    78     fyl();
    79     cout<<ans;
    80     return 0;
    81 }
  • 相关阅读:
    奇偶游戏(带权并查集)
    银河英雄传说(边带权并查集)
    程序自动分析(并查集+离散化)
    关于树状数组的小总结(树状数组)
    你能回答这些问题吗 (线段树)
    Phython 3 笔记3 —— 类,库与文件的读写
    Phython 3 笔记2 —— 基础语法
    Phython 3 笔记1 —— 基础容器
    CRJ巨佬gjd算法伪代码
    CRJ巨佬的gjd算法模板
  • 原文地址:https://www.cnblogs.com/ccd2333/p/6392101.html
Copyright © 2011-2022 走看看