• bzoj 1877: [SDOI2009]晨跑


     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #define M 6009
     5 #define inf 2139062143
     6 using namespace std;
     7 int head[M],next[10*M],u[10*M],v[10*M],w[10*M],fro[10*M],n,m,cnt=1,d[M],f[M],q[M],fr[M],ans,ans1;
     8 void jia(int a1,int a2,int a3,int a4)
     9 {
    10     cnt++;
    11     fro[cnt]=a1;
    12     u[cnt]=a2;
    13     v[cnt]=a3;
    14     w[cnt]=a4;
    15     next[cnt]=head[a1];
    16     head[a1]=cnt;
    17     return;
    18 }
    19 bool spfa()
    20 {
    21     memset(d,127,sizeof(int)*(3*n));
    22     d[1]=0;
    23     f[1]=1;
    24     q[1]=1;
    25     int h=0,t=1;
    26     for(;h<t;)
    27       {
    28         h++;
    29         int p=q[h];
    30         f[p]=0;
    31         for(int i=head[p];i;i=next[i])
    32           if(v[i]&&d[u[i]]>d[p]+w[i])
    33             {
    34                 d[u[i]]=d[p]+w[i];
    35                 fr[u[i]]=i;
    36                 if(!f[u[i]])
    37                   {
    38                     f[u[i]]=1;
    39                     t++;
    40                     q[t]=u[i];
    41                     }
    42             }
    43       }
    44     if(d[n]!=inf)
    45       return 1;
    46     return 0;
    47 }
    48 void mcf()
    49 {
    50     int mx=inf;
    51     for(int i=fr[n];i;i=fr[fro[i]])
    52       mx=min(mx,v[i]);
    53     ans1+=mx;
    54     for(int i=fr[n];i;i=fr[fro[i]])
    55       {
    56         v[i]-=mx;
    57         v[i^1]+=mx;
    58         ans+=mx*(w[i]);
    59       }
    60 }
    61 int main()
    62 {
    63     scanf("%d%d",&n,&m);
    64     for(int i=1;i<=m;i++)
    65       {
    66         int a1,a2,a3;
    67         scanf("%d%d%d",&a1,&a2,&a3);
    68         if(a1!=1&&a1!=n)
    69           a1+=n;
    70         jia(a1,a2,1,a3);
    71         jia(a2,a1,0,-a3);
    72       }
    73     for(int i=2;i<n;i++)
    74       {
    75         jia(i,i+n,1,0);
    76         jia(i+n,i,0,0);
    77       }
    78     for(;spfa();)
    79       mcf();
    80     printf("%d %d
    ",ans1,ans);
    81     return 0;
    82 }
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #define M 6009
     5 #define inf 2139062143
     6 using namespace std;
     7 int head[M],next[10*M],u[10*M],v[10*M],w[10*M],fro[10*M],n,m,cnt=1,d[M],f[M],q[M],fr[M],ans,ans1;
     8 void jia(int a1,int a2,int a3,int a4)
     9 {
    10     cnt++;
    11     fro[cnt]=a1;
    12     u[cnt]=a2;
    13     v[cnt]=a3;
    14     w[cnt]=a4;
    15     next[cnt]=head[a1];
    16     head[a1]=cnt;
    17     return;
    18 }
    19 bool spfa()
    20 {
    21     memset(d,127,sizeof(int)*(3*n));
    22     d[1]=0;
    23     f[1]=1;
    24     q[1]=1;
    25     int h=0,t=1;
    26     for(;h<t;)
    27       {
    28         h++;
    29         int p=q[h];
    30         f[p]=0;
    31         for(int i=head[p];i;i=next[i])
    32           if(v[i]&&d[u[i]]>d[p]+w[i])
    33             {
    34                 d[u[i]]=d[p]+w[i];
    35                 fr[u[i]]=i;
    36                 if(!f[u[i]])
    37                   {
    38                     f[u[i]]=1;
    39                     t++;
    40                     q[t]=u[i];
    41                     }
    42             }
    43       }
    44     if(d[n]!=inf)
    45       return 1;
    46     return 0;
    47 }
    48 void mcf()
    49 {
    50     int mx=inf;
    51     for(int i=fr[n];i;i=fr[fro[i]])
    52       mx=min(mx,v[i]);
    53     ans1+=mx;
    54     for(int i=fr[n];i;i=fr[fro[i]])
    55       {
    56         v[i]-=mx;
    57         v[i^1]+=mx;
    58         ans+=mx*(w[i]);
    59       }
    60 }
    61 int main()
    62 {
    63     scanf("%d%d",&n,&m);
    64     for(int i=1;i<=m;i++)
    65       {
    66         int a1,a2,a3;
    67         scanf("%d%d%d",&a1,&a2,&a3);
    68         if(a1!=1&&a1!=n)
    69           a1+=n;
    70         jia(a1,a2,1,a3);
    71         jia(a2,a1,0,-a3);
    72       }
    73     for(int i=2;i<n;i++)
    74       {
    75         jia(i,i+n,1,0);
    76         jia(i+n,i,0,0);
    77       }
    78     for(;spfa();)
    79       mcf();
    80     printf("%d %d
    ",ans1,ans);
    81     return 0;
    82 }

    不能相交,拆点费用流。

  • 相关阅读:
    bootstrap模态框视频,图片,页面
    curl 的用法指南
    springboot tomcat设置https,springboot配置ssl
    expect脚本
    java8新特性CompletableFuture
    Windows自动备份Oracle数据库
    SQL语句对单个的MySQL存储过程导出
    Oracle表空间的使用
    Oracle数据库基本操作
    Linux 查询 OS、CPU、内存、硬盘信息
  • 原文地址:https://www.cnblogs.com/xydddd/p/5281990.html
Copyright © 2020-2023  润新知