3436: 小K的农场
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 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
3 1 2
1 1 3 1
2 2 3 2
Sample Output
Yes
样例解释
三个农场种植的数量可以为(2,2,1)
样例解释
三个农场种植的数量可以为(2,2,1)
HINT
Source
入门题!
设点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 }