• Acwing 1169. 糖果


    题目描述
    幼儿园里有 N 个小朋友,老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。

    但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候, 老师需要满足小朋友们的 K 个要求。

    幼儿园的糖果总是有限的,老师想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。

    输入格式
    输入的第一行是两个整数 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 个小朋友分到的糖果。
    小朋友编号从 1 到 N。

    输出格式
    输出一行,表示老师至少需要准备的糖果数,如果不能满足小朋友们的所有要求,就输出 −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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    输出样例:

    11
    
    • 1

    思路:
    一道差分约束的题
    要用最长路,比方说 2 <=x, 3< =x,4<=x请问至少要用多少?那肯定得是4对吧!所以是最长路奥!
    还有就是建图方式 比方说 a + 1<= b 。那建图的话就是 a->b 权值为1。dist[b]就是b点至少需要的糖果数!
    代码:

    #include<iostream>
    #include<cstring>
    #include<stack>
    using namespace std;
    const int N = 1e6 + 10;
    int e[N], ne[N], w[N], h[N], idx = 0;
    int dist[N];
    int cnt[N];
    bool st[N];
    int n, k;
    void add(int a, int b, int c)
    {
    	w[idx] = c;
    	e[idx] = b;
    	ne[idx] = h[a];
    	h[a] = idx++;
    }
    int spfa()
    {
    	stack<int>s;
    	s.push(0);
    	st[0] = true;
    	dist[0] = 0;
    	while (!s.empty())
    	{
    		int t = s.top();
    		s.pop();
    		st[t] = false;
    		for (int i = h[t]; i != -1; i = ne[i])
    		{
    			int j = e[i];
    			if (dist[j] < dist[t] + w[i])
    			{
    				dist[j] = dist[t] + w[i];
    				cnt[j] = cnt[t] + 1;
    				if (cnt[j] >= n + 1)
    				{
    					return false;
    				}
    				if (!st[j])
    				{
    					st[j] = true;
    					s.push(j);
    				}
    			}
    		}
    	}
    	return true;
    }
    int main()
    {
    	memset(h, -1, sizeof h);
    	cin >> n >> k;
    	for (int i = 0; i < k; i++)
    	{
    		int x, a, b;
    		cin >> x >> a >> b;
    		if (x == 1)
    		{
    			add(a, b, 0);
    			add(b, a, 0);
    		}
    		else if (x == 2)
    		{
    			add(a, b, 1);
    		}
    		else if (x == 3)
    		{
    			add(b, a, 0);
    		}
    		else if (x == 4)
    		{
    			add(b, a, 1);
    		}
    		else if (x == 5)
    		{
    			add(a, b, 0);
    		}
    	}
    	for (int i = 1; i <= n; i++)
    	{
    		add(0, i, 1);
    	}
    	if (!spfa())
    	{
    		cout << -1 << endl;
    	}
    	else
    	{
    		long long res = 0;
    		for (int i = 1; i <= n; i++)
    		{
    			res += dist[i];
    		}
    		cout << res << endl;
    	}
    }
    
    • 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
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
  • 相关阅读:
    KeeWiDB 的架构由代理层和服务层两个部分构成
    AX6000路由器更改算号器密码为自定义密码的方法
    不敲代码就能搭建个人博客?快解析内网穿透来助力
    Commonjs与ES Module
    Pytorch框架的学习(4)
    微机----------------中断技术
    golang系统文件路径与文件打开问题
    2022-vue实现-“对象数组“-模糊搜索功能
    中级C++:位图
    Spring Cloud Zookeeper 升级为Spring Cloud Kubernetes
  • 原文地址:https://blog.csdn.net/weixin_50616227/article/details/125605146