首页 > 其他分享 >P3275 [SCOI2011]糖果 差分约束+最短路

P3275 [SCOI2011]糖果 差分约束+最短路

时间:2023-01-14 11:56:05浏览次数:66  
标签:P3275 int od back 差分 low push SCOI2011 mp

//题意:给定一些限制条件,询问满足条件的任一正数解是什么。(详细题意搜原题)
//思路: 本题有几个额外信息很关键
//      最大人数1e5,连出去的边只有0和-1
//      如果我们直接冲差分约束,那么复杂度会冲到1e9之上,是跑不完所有数据的
//      所以我们为了减少时间复杂度,应当减少点数与边数,所以我们想到缩点
//      但是这题需判断是否无解(有负环),所以我们应当首先判断负环,不过好在这题的边权除了-1就只有0,所以我们缩点后对每个强联通分量进行判断,看有没有-1就行
//      另外当最短路图中没有环时,我们可以先拓扑排序然后按拓扑序求最短路
//      最后这题的复杂度应该接近O(n+m)
//
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int n, k;
vector<pair<int, int>> mp[N];
vector<pair<int, int>> nmp[2 * N];//重边对最短路没有影响
void read() {
    int od, a, b; cin >> od >> a >> b;
    if (od == 1) {
        mp[a].push_back({ b,0 });
        mp[b].push_back({ a,0 });
    }
    else if (od == 2) mp[b].push_back({ a,-1 });
    else if (od == 3) mp[a].push_back({ b,0 });
    else if (od == 4) mp[a].push_back({ b,-1 });
    else if (od == 5) mp[b].push_back({ a,0 });
}
int dfn[N], idx, bel[N], low[N], ins[N], cnt, sz[N];
stack<int> stk;
vector<int> scc[N]; 
void dfs(int x) {
    dfn[x] = low[x] = ++idx;
    stk.push(x);
    ins[x] = 1;
    for (auto v : mp[x]) {
        int tp = v.first;
        if (!dfn[tp]) {
            dfs(tp);
            low[x] = min(low[x], low[tp]);
        }
        else if (ins[tp]) low[x] = min(low[x], dfn[tp]);
    }
    if (dfn[x] == low[x]) {
        ++cnt;
        while (true) {
            int v = stk.top();
            scc[cnt].push_back(v);
            sz[cnt]++;
            ins[v] = false;
            bel[v] = cnt;
            stk.pop();
            if (v == x) break;
        }
    }
}
int rd[2 * N], cnt1, odr[N];
queue<int> lis;
void topo() {
    while (!lis.empty()) {
        int x = lis.front();
        odr[++cnt1] = x;
        for (auto y : nmp[x]) {
            rd[y.first]--;
            if (!rd[y.first]) lis.push(y.first);
        }
        lis.pop();
    }
}
int dis[2 * N];
signed main() {
    cin >> n >> k;
    for (int i = 1; i <= k; i++) read();
    for (int i = 1; i <= n; i++) mp[i].push_back({ 0,-1 });//最小糖果树是正数,所以满足xi-x0>=1
    for (int i = 1; i <= n; i++)
        if (!dfn[i]) dfs(i);

    for (int i = 1; i <= cnt; i++)
        for (auto x : scc[i]) 
            for (auto v : mp[x]) 
                if (bel[v.first] == i && v.second == -1) {
                    cout << -1; return 0;
                }
    //有负环
    for (int i = 1; i <= cnt; i++)
        for (auto x : scc[i])
            for (auto v : mp[x])
                if (bel[x] != bel[v.first]) {
                    nmp[n + i].push_back({ n + bel[v.first], v.second});//建新图
                    rd[n + bel[v.first]]++;
                }

    
    for (int i = 1 + n; i <= n + cnt; i++) dis[i] = 1 << 29;

    for (int i = 1 + n; i <= n + cnt; i++) {
        if (rd[i] == 0) {
            dis[i] = 0;
            lis.push(i);
        }
    }
    topo();

    for (int i = 1; i <= cnt1; i++)
        for (auto x : nmp[odr[i]])
            if (dis[odr[i]] + x.second < dis[x.first])
                dis[x.first] = dis[odr[i]] + x.second;

    int ans = 0, dis0 = dis[bel[0] + n];
    
    
    for (int i = 1 + n; i <= n + cnt; i++) {
        ans +=  sz[i - n] * (dis[i] - dis0);
    }

cout << ans;

return 0;
}

 

标签:P3275,int,od,back,差分,low,push,SCOI2011,mp
From: https://www.cnblogs.com/Aacaod/p/17051513.html

相关文章

  • 【学习笔记】差分约束
    1.算法介绍差分约束系统是一种特殊的\(N\)元一次不等式组,它包含\(N\)个变量\(X_1\simX_N\)以及\(M\)个约束条件,每个约束条件是由两个其中的变量做差构成的,形如......
  • 差分两道题
    https://www.acwing.com/activity/content/problem/content/334/参考代码:1//差分的性质运用和基本思维2//差分就不多说了基本操作3//题目要求得到的数都一样的......
  • 时间序列分析 Tsfresh 基于统计学的时间序列分析方法 3、差分整合移动平均自回归模型(A
    原文链接:点这里在了解了AR和MA模型后,我们将进一步学习结合了这两者的ARIMA模型,ARIMA在时间序列数据分析中有着非常重要的地位。但在这之前,让我们先来看ARIMA的简化版ARMA......
  • 数据分享|R语言逐步回归、方差分析anova电影市场调查问卷数据可视化|附代码数据
    全文链接:http://tecdat.cn/?p=30680最近我们被客户要求撰写关于电影市场调查问卷数据的研究报告,包括一些图形和统计输出。这是一份有关消费者对电影市场看法及建议的调查......
  • 有用的技巧(前缀、差分、位运算、快速幂、倍增)
    前缀和一维前缀和 for(inti=1;i<=n;++i){pre[i]=pre[i-1]+a[i];}二维前缀和 for(inti=1;i<=n;++i){......
  • NC20284 [SCOI2011]糖果
    题目链接题目题目描述幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明......
  • 压力应变桥信号处理系列隔离放大器差分输入转换0-10mV/0-20mV/0-±10mV/0-±20mV
    ​主要特性DIN11IPO压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器......
  • 记录一道贪心+差分的题目
    由于差分这个知识点经常会被本人忘记,可能是做的题目太少了没怎么碰到。。。因此记录一道贪心加上差分的题目。本题为第十三届蓝桥杯省赛C++C组题目:4655.重新排序具体思......
  • 高精度+前缀和+差分
    高精度+前缀和+差分高精度高精度加法大整数存储:将数字存到数组里,第一个位置存个位,第二个位置存十位......从\(A_0+B_0\)开始算起,算个位,满十进一易错点:将数字存在......
  • 前缀和,差分
    前缀和,差分通俗理解前缀和听起来好高级啊,那么他究竟是什么啊?当询问一个区间[l,r]的和sum(忽略掉O(n)的暴力,它就发挥了大用处。基本的前缀和如下:s[i]=s[i-1]+a[i]......