acwing-1169. 糖果(差分约束)「建议收藏」

acwing-1169. 糖果(差分约束)「建议收藏」幼儿园里有 N 个小朋友,老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候, 老师需要满足小朋友们的 K 个要求。幼儿园的糖果总是有限的,老师想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。输入格式输入的第一行是两个整数 N,K。接下来 K 行,表示分配糖果时需要满足的关系,每行 3 个数字 X,A,B。如果 X=1.表示第 A 个小

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

数据范围
1≤N<105,
1≤K≤105,
1≤X≤5,
1≤A,B≤N

输入样例:
5 7
1 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1
输出样例:
11

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int M = 3e5 + 10;
const int INF = 0x3f3f3f3f;
typedef long long ll;
struct Edge{ 
   
    int v,next,w;
}edge[M];
int head[N],cnt;
int s,e;
    int n,m;
int q[N],hh = 0,tt = 0;
int dist[N],c[N];
bool vis[N];
void add(int u,int v,int w){ 
   
    edge[cnt].v = v;
    edge[cnt].w = w;
    edge[cnt].next = head[u];
    head[u] = cnt ++;
}
ll spfa(){ 
     
    memset(dist,-INF,sizeof dist);
    dist[0] = 0,q[tt ++] = 0,vis[0] = true;
    c[0] = 0;
    while(hh < tt){ 
   
        int t = q[-- tt];
        vis[t] = false;
        for(int i = head[t];~i;i =edge[i].next){ 
   
            int v = edge[i].v,w = edge[i].w;    
            if(dist[v] < dist[t] + w){ 
   
                dist[v] = dist[t] + w;
                c[v] = c[t] + 1;
                if(c[v] >= n + 1)return -1;
                if(!vis[v]){ 
   
                    vis[v] = true;
                    q[tt ++] = v;
                }
            }
        }
    }
    ll ans = 0;
    for(int i = 1;i <= n;i ++)ans += dist[i];
    return ans;
}
int main(){ 
   
    scanf("%d %d",&n,&m);
    int x,y;
    int c;
    memset(head,-1,sizeof head);
    for(int i = 0;i < m;i ++){ 
   
        scanf("%d %d %d",&c,&x,&y);
        if(c == 1)add(x,y,0),add(y,x,0);
        if(c == 2)add(x,y,1);
        if(c == 3)add(y,x,0);
        if(c == 4)add(y,x,1);
        if(c == 5)add(x,y,0);
    }
    for(int i = 1;i <= n;i ++){ 
   
        add(0,i,1);
    }
    ll ans = spfa();
    printf("%lld",ans);
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169082.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • readprocessmemory函数分析_memory的用法及形式

    readprocessmemory函数分析_memory的用法及形式函数功能:该函数从指定的进程中读入内存信息,被读取的区域必须具有访问权限。函数原型:BOOLReadProcessMemory(HANDLEhProcess,LPCVOIDlpBaseAddress,LPVOIDlpBuffer,DWORDnSize,LPDWORDlpNumberOfBytesRead);参数:hProcess:进程句柄

    2022年10月4日
    0
  • idea 激活码破解(最新序列号破解)

    idea 激活码破解(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    612
  • document.all用法(一)

    document.all用法(一)1、理解document.all[]  从IE4开始IE的objectmodel才增加了document.all[],来看看document.all[]的Description:ArrayofallHTMLtagsinthedocument.Collectionofallelementscontainedbytheobject.  也就是说document.all

    2022年7月12日
    16
  • 什么是第一,第二,第三范式

    什么是第一,第二,第三范式我们在数据库表设计时,经常说,某某表要遵循第三范式。下面通过实例介绍第一,第二,第三范式第一范式所谓第一范式,就是数据表的列不可再分。看下面数据表,对于选课列明显是可以再分的,所以它是违反第一范式的。学号姓名选课10001张三数学,语文,英语10002

    2022年5月23日
    37
  • unity3D入门_unity怎么学

    unity3D入门_unity怎么学UnityShader中级(Unity2019unity教程初级中级高级扫码时备注或说明中留下邮箱付款后如未回复请加微信630105904联系本博主

    2022年8月10日
    5
  • 如何申请注册在国内可以登录使用国外邮箱?「建议收藏」

    如何申请注册在国内可以登录使用国外邮箱?「建议收藏」2022年冬奥会的开始、冰墩墩的爆火,这些让在国外无法回国的华人,十分羡慕,也让很多之前不怎么联系的朋友使用邮件交流了起来,那么是不是所有邮箱都可以向国外发信呢?其实并不是,我之前使用过,很多邮箱都是无法向国外发信的,现在我注册使用的是TomVIP邮箱,公司使用的Tom企业邮箱,因为做出口贸易,才选择的这家邮箱,在国外收发信方面做的还是非常棒的!如何申请注册国外邮箱首先,要进入邮箱官网(网页进行搜索、网址直接进入),选择自己喜欢的邮箱域名,点击注册;其次,选择邮箱套餐,依据自己日常使用的邮箱容量、发信

    2022年7月12日
    91

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号