• bzoj 2330: [SCOI2011]糖果


    神奇的差分约束??百度写的很明白(感觉其实就一句话有用)

     1 #include<bits/stdc++.h>
     2 #define N 200005
     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 to,next,v;
    17 }e[N<<1];
    18 int head[N],cnt,q[N<<2],tot[N],n,m;
    19 bool inq[N];
    20 int dis[N]; LL ans;
    21 void insert(int x, int y, int v)
    22 {
    23     e[++cnt].to=y; e[cnt].next=head[x]; e[cnt].v=v; head[x]=cnt;
    24 }
    25 bool SPFA()
    26 {
    27     int l=0,r=1; q[0]=0; inq[0]=1; tot[0]=1;
    28     while (l<r)
    29     {
    30         int x=q[l++];
    31         for (int i=head[x];i;i=e[i].next)
    32             if (dis[e[i].to]<dis[x]+e[i].v)
    33             {
    34                 dis[e[i].to]=dis[x]+e[i].v;
    35                 if (++tot[e[i].to]>=n) return 0;
    36                 if (!inq[e[i].to])
    37                 {
    38                     inq[e[i].to]=1;
    39                     q[r++]=e[i].to;
    40                 }
    41             }
    42         inq[x]=0;
    43     }
    44     return 1;
    45 }
    46 int main()
    47 {
    48     n=ra(); m=ra();
    49     for (int i=1; i<=m; i++)
    50     {
    51         int opt=ra(),a=ra(),b=ra();
    52         if (opt==1) insert(b,a,0),insert(a,b,0);
    53         if (opt==2) {
    54             if (a==b) {puts("-1"); return 0;}
    55                 else insert(a,b,1);
    56         }
    57         if (opt==3) insert(b,a,0);
    58         if (opt==4){
    59             if (a==b) {puts("-1"); return 0;}
    60                 else insert(b,a,1);
    61         }
    62         if (opt==5) insert(a,b,0);
    63     }
    64     for (int i=n; i>=1; i--) insert(0,i,1);
    65     if (!SPFA()) {puts("-1"); return 0;}
    66     for (int i=1; i<=n; i++) ans+=(LL)dis[i];
    67     cout<<ans;
    68     return 0;
    69 } 
  • 相关阅读:
    常见网络设备工作原理
    Linux逻辑卷的创建
    关于华为模拟器eNSP-防火墙USG6000V怎么重装镜像
    一人之下(名言吧)
    Struts2学习笔记——Struts2搭建和第一个小程序
    eclipse部署Tomcat9
    通过反射访问类的私有方法(无参)
    Java学习笔记之——IO
    Java学习笔记之——线程的生命周期、线程同步
    Java学习笔记之——多线程
  • 原文地址:https://www.cnblogs.com/ccd2333/p/6482434.html
Copyright © 2020-2023  润新知