「NOIP模拟赛」小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就行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<cmath> #define inf 0x7fffffff #define ll long long using namespace std; inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,m,cnt; int head[100005],dis[100005]; bool flag,mark[100005]; struct data{int to,next,v;}e[100005]; void insert(int u,int v,int w) {e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;e[cnt].v=w;} void spfa(int x) { mark[x]=1; for(int i=head[x];i;i=e[i].next) if(e[i].v+dis[x]>dis[e[i].to]) { if(mark[e[i].to]){flag=1;return;} else { dis[e[i].to]=e[i].v+dis[x]; spfa(e[i].to); } } mark[x]=0; } bool jud() { for(int i=1;i<=n;i++)dis[i]=mark[i]=0; flag=0; for(int i=1;i<=n;i++) {spfa(i);if(flag)return 1;} return 0; } int main() { //freopen("farm.in","r",stdin); //freopen("farm.out","w",stdout); n=read();m=read(); for(int i=1;i<=m;i++) { int f=read(); int a=read(),b=read(),c; if(f==1) { c=read(); if(a==b){printf("No");return 0;} insert(b,a,c); } else if(f==2) { c=read(); if(a==b){printf("No");return 0;} insert(a,b,-c); } else {insert(a,b,0);insert(b,a,0);} } for(int i=n;i>0;i--)insert(0,i,1); if(jud()){printf("No");return 0;} printf("Yes"); return 0; } |
Subscribe