zoukankan      html  css  js  c++  java
  • P1993 小 K 的农场

    P1993 小 K 的农场

    题目描述

    小 K 在 Minecraft 里面建立很多很多的农场,总共 n 个,以至于他自己都忘记了每个

    农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m 个),以下列三种形式描

    述:

    1. 农场 a 比农场 b 至少多种植了 c 个单位的作物。

    2. 农场 a 比农场 b 至多多种植了 c 个单位的作物。

    3. 农场 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”。

    输入输出样例

    输入样例#1:
    3 3
    3 1 2
    1 1 3 1
    2 2 3 2
    
    输出样例#1:
    Yes
    

    说明

    对于 100% 的数据保证:1 ≤ n,m,a,b,c ≤ 10000。

     code

     1 #include<cstdio>
     2 #include<cstring>
     3 
     4 const int MAXN = 20010;
     5 struct Edge{
     6     int to,w,nxt;
     7 }e[100100];
     8 int dis[MAXN],head[MAXN];
     9 bool vis[MAXN];
    10 int n,m,cnt;
    11 
    12 void add(int u,int v,int w)
    13 {
    14     ++cnt;
    15     e[cnt].to = v;
    16     e[cnt].w = w;
    17     e[cnt].nxt = head[u];
    18     head[u] = cnt;
    19 }
    20 bool spfa(int u)
    21 {
    22     vis[u] = true ;
    23     for (int i=head[u]; i; i=e[i].nxt)
    24     {
    25         if (dis[e[i].to]>dis[u]+e[i].w)
    26         {
    27             dis[e[i].to] = dis[u]+e[i].w;
    28             if (vis[e[i].to]) return false ;
    29             spfa(e[i].to);
    30         }
    31     }
    32     vis[u] = false ;
    33     return true;
    34 }
    35 int main()
    36 {
    37     scanf("%d%d",&n,&m);
    38     for (int x,a,b,c,i=1; i<=m; ++i)
    39     {
    40         scanf("%d",&x);
    41         if (x==1)
    42         {
    43             scanf("%d%d%d",&a,&b,&c);
    44             add(a,b,-c);
    45         }
    46         else if (x==2)
    47         {
    48             scanf("%d%d%d",&a,&b,&c);
    49             add(b,a,c);
    50         }
    51         else 
    52         {
    53             scanf("%d%d",&a,&b);
    54             add(a,b,0);
    55             add(b,a,0);
    56         }
    57     }
    58     for(int i=0; i<=n; i++) add(0,i,0);
    59     memset(dis,0x3f,sizeof(dis));
    60     dis[0] = 0;
    61     if (spfa(0)) printf("Yes");
    62     else printf("No");
    63     return 0;
    64 }

     

  • 相关阅读:
    Java虚拟机--编译那点事儿
    Java虚拟机--常用Java命令(二)
    Java虚拟机--常用Java命令(一)
    Java虚拟机--类加载机制
    Java虚拟机--JIT编译器
    Java虚拟机--垃圾回收机制
    Java虚拟机--对象模型
    Junit测试--多个测试接口如何产生业务联系
    Java虚拟机--内存模型
    Java虚拟机--内存结构
  • 原文地址:https://www.cnblogs.com/mjtcn/p/7128347.html
Copyright © 2011-2022 走看看