zoukankan      html  css  js  c++  java
  • [bzoj]3436 小K的农场

    【题目描述】

         小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述:农场a比农场b至少多种植了c个单位的作物,农场a比农场b至多多种植了c个单位的作物,农场a与农场b种植的作物数一样多。但是,由于小K的记忆有些偏差,所以他想要知道存不存在一种情况,使得农场的种植作物数量与他记忆中的所有信息吻合。

    【输入格式】 farm.in

         第一行包括两个整数n和m,分别表示农场数目和小K记忆中的信息数目。

         接下来m行:

         如果每行的第一个数是1,接下来有3个整数a,b,c,表示农场a比农场b至少多种植了c个单位的作物。

         如果每行的第一个数是2,接下来有3个整数a,b,c,表示农场a比农场b至多多种植了c个单位的作物。

         如果每行第一个数是3,家下来有2个整数a,b,表示农场a终止的数量和b一样多。

    【输出格式】 farm.out

      如果存在某种情况与小K的记忆吻合,输出“Yes”,否则输出“No”。

    【样例输入】

    3 3

    3 1 2

    1 1 3 1

    2 2 3 2

    【样例输出】

    Yes

    样例解释:三个农场种植数量可以为(2,2,1)。

    对于100%的数据  1<=n,m,a,b,c<=10000.

    裸的spfa_dfs判负环

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 
     5 struct Edge
     6 {
     7     int to,w,next;
     8 }E[10000001];
     9 int node=0,head[10001],dist[10001];
    10 bool vis[10001];
    11 
    12 int n,m;
    13 bool flag;
    14 
    15 void insert(int u,int v,int w)
    16 {
    17     E[++node]=(Edge){v,w,head[u]};
    18     head[u]=node;
    19 }
    20 
    21 void spfa_dfs(int s)
    22 {
    23     vis[s]=1;
    24     for(int i=head[s];i;i=E[i].next)
    25     {
    26         int to=E[i].to,w=E[i].w;
    27         if(dist[s]+w<dist[to])
    28         {
    29             if(vis[to]){flag=1;return;}
    30             else
    31             {
    32                 dist[to]=dist[s]+w;
    33                 spfa_dfs(to);
    34             }
    35         }
    36     }
    37     vis[s]=0;
    38 }
    39 
    40 bool check()
    41 {
    42     flag=0;
    43     memset(dist,0x7f,sizeof(dist));
    44     memset(vis,0,sizeof(vis));
    45     for(int i=1;i<=n;i++)
    46     {
    47         dist[i]=0;
    48         spfa_dfs(i);
    49         if(flag) return 1;
    50     }
    51     return 0;
    52 }
    53 
    54 int read()
    55 {
    56     int x=0,f=1;char ch=getchar();
    57     while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
    58     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    59     return x*f;
    60 }
    61 
    62 int main()
    63 {
    64     n=read();m=read();
    65     for(int i=1;i<=m;i++)
    66     {
    67         int f,a,b,c;
    68         f=read();
    69         switch(f)
    70         {
    71         case 1:
    72             a=read();b=read();c=read();
    73             insert(a,b,-c);
    74             break;
    75         case 2:
    76             a=read();b=read();c=read();
    77             insert(b,a,c);
    78             break;
    79         case 3:
    80             a=read();b=read();
    81             insert(a,b,0);
    82             insert(b,a,0);
    83             break;
    84         }
    85     }
    86     if(check()) printf("No");
    87     else printf("Yes");
    88     return 0;
    89 }
  • 相关阅读:
    asp.net 生成PDF方法
    C# 缓存学习总结
    C# 缓存学习第一天
    C# 文件管理类 Directory
    C# 链接Sql和Access数据库语句
    SQL Server ->> 高可用与灾难恢复(HADR)技术 -- AlwaysOn(实战篇)之AlwaysOn可用性组搭建
    SQL Server ->> 高可用与灾难恢复(HADR)技术 -- AlwaysOn(实战篇)之建立活动目录域、DNS服务器和Windows故障转移群集(准备工作)
    SQL Server ->> 高可用与灾难恢复(HADR)技术 -- AlwaysOn可用性组(理论篇)
    SQL Server ->> 利用CONVERT/STR/FORMAT函数把浮点型数据格式化/转换成字符串
    SQL Server ->> Computed Column(计算列)
  • 原文地址:https://www.cnblogs.com/InWILL/p/6031649.html
Copyright © 2011-2022 走看看