【BZOJ】3436: 小K的农场

3436: 小K的农场

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 938  Solved: 417
[Submit][Status][Discuss]

Description

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

Input

第一行包括两个整数n和m,分别表示农场数目和小K记忆中的信息的数目接下来m行:如果每行的第一个数是1,接
下来有三个整数a,b,c,表示农场a比农场b至少多种植了c个单位的作物如果每行第一个数是2,接下来有三个整数a
,b,c,表示农场a比农场b至多多种植了c个单位的作物如果每行第一个数是3,接下来有两个整数a,b,表示农场a
种植的数量与b一样。1<=n,m,a,b,c<=10000

 

Output

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

 

Sample Input

3 3
3 1 2
1 1 3 1
2 2 3 2

Sample Output

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

HINT

 

Source

Kpmcup#0 By Greens


 

入门题!

设点x,y相差c

若x==y,x与y之间连两条权值为0的的边

x-y<=c,y向x连一条权值为c的边

x-y>=c变形为y-x<=c,x向y连一条权值为-c的边

 

构出一张有向图,利用SPFA在图中找负权环,若有负权环则说明答案不合法(SPFA找负权环应当使用DFS版的)


 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<vector>
 7 #include<cmath>
 8 #include<ctime>
 9 #include<cstring>
10 #define yyj(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout);
11 #define llg long long
12 #define maxn 50000
13 #define md 20000
14 #define inf (llg)1e16
15 using namespace std;
16 llg i,j,k,n,m,dl[maxn*10],head,tail,dis[maxn],bj[maxn],js[maxn],heh,top,stack[maxn];
17 bool f;
18 
19 vector <llg> a[maxn],val[maxn];
20 
21 void link(llg x,llg y,llg v)
22 {
23     a[x].push_back(y),val[x].push_back(v);
24 }
25 
26 void init()
27 {
28     llg x,y,t,v;
29     cin>>n>>m;
30     for (i=1;i<=m;i++)
31     {
32         scanf("%lld%lld%lld",&t,&x,&y);
33         if (t==3)
34         {
35             link(x,y,0); link(y,x,0);
36         }
37         if (t==2)
38         {
39             scanf("%lld",&v);
40             link(y,x,v);
41         }
42         if (t==1)
43         {
44             scanf("%lld",&v);
45             link(x,y,-v);
46         }
47     }
48     f=true;
49 }
50 
51 bool SPFA()
52 { 
53     for(llg i=1;i<=n;i++) dis[i]=0,stack[++top]=i,bj[i]=1;
54     llg u,w;
55     while(top>0)
56     {
57         u=stack[top]; top--; bj[u]=0;
58         w=a[u].size();
59         for(llg i=0;i<w;i++)
60         {
61             llg v=a[u][i]; 
62             if(dis[v]>dis[u]+val[u][i])
63             {
64                 dis[v]=dis[u]+val[u][i];
65                 if(!bj[v]) { bj[v]=1; stack[++top]=v; js[v]++; if(js[v]>=n) return false;}
66             }
67         }
68     }
69     return true;
70 }
71 
72 int main()
73 {
74     yyj("a");
75     init();
76     if (SPFA()) cout<<"Yes"; else cout<<"No";
77     return 0;
78 }

 

转载于:https://www.cnblogs.com/Dragon-Light/p/5917075.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值