zoukankan      html  css  js  c++  java
  • 【BZOJ2330】【SDOI2012】糖果(差分约束,SPFA)

    【BZOJ2330】【SDOI2012】糖果

    题面

    题目描述

    幼儿园里有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。

    输入输出样例

    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

    题解

    差分约束大火题模板题
    对于每个操作直接建边
    然后跑(SPFA)即可

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<set>
    #include<stack>
    #include<map>
    #include<vector>
    #include<queue>
    using namespace std;
    #define MAX 110000
    int n;
    inline int read()
    {
    	int x=0,t=1;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=-1,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return x*t;
    }
    struct Line
    {
    	int v,next,w;
    }e[MAX<<1];
    int h[MAX],cnt=1;
    inline void Add(int u,int v,int w)
    {
    	e[cnt]=(Line){v,h[u],w};
    	h[u]=cnt++;
    }
    int dis[MAX],InQ[MAX];
    bool vis[MAX];
    queue<int> Q;
    void SPFA()
    {
    	bool FL=true;
    	for(int i=1;i<=n;++i)
    		dis[i]=InQ[i]=vis[i]=1,Q.push(i);
    	while(!Q.empty())
    	{
    		int u=Q.front();Q.pop();
    		for(int i=h[u];i;i=e[i].next)
    		{
    			int v=e[i].v;
    			int w=dis[u]+e[i].w;
    			if(dis[v]<w)
    			{
    				dis[v]=w;
    				if(!vis[v])
    				{
    					vis[v]=true,Q.push(v),InQ[v]++;
    					if(InQ[v]>=n)
    					{
    						FL=false;
    						break;
    					}
    				}
    			}
    		}
    		if(!FL)break;
    		vis[u]=false;
    	}
    	if(!FL)
    	{
    		printf("-1
    ");
    		return;
    	}
    	long long ans=0;
    	for(int i=1;i<=n;++i)ans+=dis[i];
    	printf("%lld
    ",ans);
    }
    int main()
    {
    	n=read();int K=read();
    	int X,u,v;
    	while(K--)
    	{
    		X=read();u=read();v=read();
    		if(X==1){Add(u,v,0);Add(v,u,0);}
    		else if(X==2){Add(u,v,1);}
    		else if(X==3){Add(v,u,0);}
    		else if(X==4){Add(v,u,1);}
    		else if(X==5){Add(u,v,0);}
    		if(!(X&1)&&u==v)
    		{
    			printf("-1
    ");
    			return 0;
    		}
    	}
    	SPFA();
    	return 0;
    }
    
    
  • 相关阅读:
    取得元素节点的默认display值
    mass Framework emitter模块 v2
    memset函数详细说明
    八大排序算法总结
    电脑很卡,怎么办?这里帮你解决
    Android APK反编译详解(附图)
    java环境变量配置
    如何使用U盘安装操作系统 安装GHOST XP, xp纯净版
    c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)
    Js apply 方法 详解
  • 原文地址:https://www.cnblogs.com/cjyyb/p/7725932.html
Copyright © 2011-2022 走看看