P1993 小 K 的农场

Posted alex-leaves

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。

 

看到这题,妥妥的差分约束……

注意用dfs的方法判断负环。

AC代码如下:

#include<cstdio>
#include<vector>
using namespace std;
const int N=10000+5; 
struct p{
    int to,w;
}now; 
vector<p>a[N];
int dis[N],x,y,z,m,n,t;
bool ans,vis[N];
void dfs(int x)
{
    vis[x]=1;
    for(int i=0;i<a[x].size();i++)
    {
        now=a[x][i];
        if(dis[now.to]>dis[x]+now.w)
        {
            if(vis[now.to]) {
                ans=1;return;
            }
            dis[now.to]=dis[x]+now.w;
            dfs(now.to);
        }
    }
    vis[x]=0;
    return;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        if(x==3) a[y].push_back((p){z,0}),a[z].push_back((p){y,0});
        else {
            scanf("%d",&t);
            if(x==1) a[y].push_back((p){z,-t});
            else a[z].push_back((p){y,t});
        }
    }
    for(int i=1;i<=n;i++)
    {
        dis[i]=0;
        dfs(i);
        if(ans) break;
    }
    if(ans) printf("No");
    else printf("Yes");
    return 0;
}

 

以上是关于P1993 小 K 的农场的主要内容,如果未能解决你的问题,请参考以下文章

P1993 小 K 的农场

洛谷P1993 小 K 的农场

P1993 小K的农场

小K的农场(luogu P1993

P1993 小K的农场

P1993 小K的农场