bzoj2330&luogu3275 scoi2011糖果

网友投稿 466 2022-10-05

bzoj2330&luogu3275 scoi2011糖果

bzoj2330&luogu3275 scoi2011糖果

​​ 题目描述

幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求。幼儿园的糖果总是有限的,lxhgww想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。

输入输出格式

输入格式:

输入的第一行是两个整数N,K。接下来K行,表示这些点需要满足的关系,每行3个数字,X,A,B。如果X=1, 表示第A个小朋友分到的糖果必须和第B个小朋友分到的糖果一样多;如果X=2, 表示第A个小朋友分到的糖果必须少于第B个小朋友分到的糖果;如果X=3, 表示第A个小朋友分到的糖果必须不少于第B个小朋友分到的糖果;如果X=4, 表示第A个小朋友分到的糖果必须多于第B个小朋友分到的糖果;如果X=5, 表示第A个小朋友分到的糖果必须不多于第B个小朋友分到的糖果;

输出格式:

输出一行,表示lxhgww老师至少需要准备的糖果数,如果不能满足小朋友们的所有要求,就输出-1。

输入输出样例

输入样例#1:

5 7 1 1 2 2 3 2 4 4 1 3 4 5 5 4 5 2 3 5 4 5 1 输出样例#1:

11 说明

数据范围】

对于30%的数据,保证 N<=100

对于100%的数据,保证 N<=100000

对于所有的数据,保证 K<=100000,1<=X<=5,1<=A, B<=N

神。。优化 建边的时候倒着建

for (int i=n;i>=1;–i) insert1(0,i,-1); 求一个最大路 ​​​M 330000#define N 110000using namespace std;inline char gc(){ static char now[1<<16], *S, *T; if(S==T){T=(S=now)+fread(now, 1, 1<<16, stdin); if(S==T)return EOF;} return *S++;}inline long long read(){ long long x=0;char ch=gc(); while (ch<'0'||ch>'9') ch=gc(); while (ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=gc();} return x;}long long f[N];int h[N],num,n,m;bool flag[N];struct node{ int y,next,z;}data[M];void insert1(int x,int y,int z){ data[++num].y=y;data[num].next=h[x];h[x]=num;data[num].z=z;}queue q;int time[N];bool flag1;void spfa(){ memset(f,0x7f,sizeof(f));memset(flag,0,sizeof(flag)); f[0]=0;flag[0]=true;q.push(0);time[0]=1; while (!q.empty()){ int x=q.front();q.pop();flag[x]=false; for (int i=h[x];i;i=data[i].next){ int y=data[i].y,z=data[i].z; if (f[x]+zn){flag1=true;return ;} q.push(y);flag[y]=true; } } } }}int main(){ freopen("3275.in","r",stdin); n=read();m=read(); for (int i=n;i>=1;--i) insert1(0,i,-1); for (int i=1;i<=m;++i){ int op=read(),a=read(),b=read(); if (op==1) {insert1(a,b,0);insert1(b,a,0);continue;} if (op==2){if (a==b){printf("-1");return 0;}insert1(a,b,-1);continue;} if (op==3){insert1(b,a,0);continue;} if (op==4){if (a==b){printf("-1");return 0;} insert1(b,a,-1);continue;} insert1(a,b,0); } spfa();long long ans=0; if (flag1) {printf("-1");return 0;} for (int i=1;i<=n;++i) ans+=f[i]; printf("%lld",-ans); return 0;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:小结—在微信小程序开发中会遇到的一些问题(微信小程序面临的问题)
下一篇:android微信登陆、分享做了一段时间了发现的一些坑(android 分享到微信)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~