zoukankan      html  css  js  c++  java
  • bzoj 2330: [SCOI2011]糖果

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 int n,m,cnt,head[100006],next[400006],u[400006],v[400006],h,t,a[100006];
     5 int ci[100006],f[100006];
     6 long long d[100006];
     7 void jia(int a1,int a2,int a3)
     8 {
     9     cnt++;
    10     next[cnt]=head[a1];
    11     head[a1]=cnt;
    12     u[cnt]=a2;
    13     v[cnt]=a3;
    14 }
    15 int main()
    16 {
    17     scanf("%d%d",&n,&m);
    18     for(int i=0;i<m;i++)
    19       {
    20         int a1,a2,a3;
    21         scanf("%d%d%d",&a1,&a2,&a3);
    22         if(a1==1)
    23           {
    24             jia(a2,a3,0);
    25             jia(a3,a2,0);
    26             }
    27         if(a1==2)
    28         {if(a2==a3){printf("-1");return 0;}
    29           jia(a2,a3,1);}
    30         if(a1==3)
    31           jia(a3,a2,0);
    32         if(a1==4)
    33         {if(a2==a3){printf("-1");return 0;}
    34           jia(a3,a2,1);}
    35         if(a1==5)
    36           jia(a2,a3,0);
    37       }
    38     for(int i=n;i;i--)
    39       jia(0,i,1);
    40     a[1]=0;
    41     ci[0]++;
    42     t=1;
    43     f[0]=1;
    44     for(;h!=t;)
    45       {
    46         h++;
    47         if(h>100004)
    48         h=1;
    49         f[a[h]]=0;
    50         for(int i=head[a[h]];i;i=next[i])
    51           if(d[u[i]]<d[a[h]]+v[i])
    52             {
    53                 d[u[i]]=d[a[h]]+v[i];
    54                 ci[u[i]]++;
    55                 if(ci[u[i]]==n+1)
    56                   {
    57                     printf("-1
    ");
    58                     return 0;
    59                     }
    60                 if(!f[u[i]])
    61                   {
    62                     t++;
    63                     if(t>100004)
    64                       t=1;
    65                     a[t]=u[i];
    66                     f[u[i]]=1;
    67                   }
    68               }
    69       }
    70     long long ans=0;
    71     for(int i=1;i<=n;i++)
    72       ans+=d[i];
    73     printf("%lld",ans);
    74     return 0;
    75 }

    差分约束系统,根据条件建边跑最短路。

  • 相关阅读:
    VS自带的诊断工具
    Electron学习
    PC跨*台
    .NET调试学习
    Mac使用
    SSL/TLS
    UKey学习
    授权机制OAuth、JWT
    代理服务器
    .NET相关源码查找
  • 原文地址:https://www.cnblogs.com/xydddd/p/5300225.html
Copyright © 2011-2022 走看看