首页 > 其他分享 >P1073 [NOIP2009 提高组] 最优贸易 强联通分量+缩点

P1073 [NOIP2009 提高组] 最优贸易 强联通分量+缩点

时间:2023-01-08 16:34:09浏览次数:41  
标签:缩点 cnt int NOIP2009 fmp st low P1073 dp

//题意:给出有向图,有环(SCC),每个节点有一个 商品值 ,小明想从1点走向n点,同时想要进行一次贸易,即从路线上某个点买入商品, 又在某个节点卖出, 询问最大收益是多少(如果收益为负数那么输出0)
//思路:有环第一时间想到tarjan缩点,重建一幅无环有向图
//      因为我想取得最大收益,所以在到达一个点时,我应该用路径上的最小价进货,同时看在这点卖出是否能取得最大值,是一个dp问题(用前点更新后点)
//      注释内是用的dfs序跑dp,但是会T掉几个点,具体的情况实在无法想象出来
//      所以为了保险起见,跑dp这种需要前提条件来更新后面条件的有序结构,要使用拓扑序
//      另外缩点会有重边问题,本题无影响,但是其他题要视具体情况考虑
//
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
vector<int> mp[N], mp2[2 * N];
int n, m, wt[N];
int dfn[N], low[N], ins[N], bel[N], idx, cnt;//dfn序,low值,是否存在,哪个强联通分量(缩点用)
stack<int> stk;
int dp[N];
map<pair<int, int>, bool> ct;
struct point {
    int in, out;
}fmp[2 * N];
void dfs(int u) {
    dfn[u] = low[u] = ++idx;
    ins[u] = true;
    stk.push(u);

    for (auto v : mp[u]) {
        if (!dfn[v]) dfs(v);
        if (ins[v]) low[u] = min(low[u], low[v]);
    }

    if (dfn[u] == low[u]) {
        ++cnt;
        int maxn = -1e9, minn = 1e9;
        while (true) {
            int v = stk.top();
            maxn = max(maxn, wt[v]);
            minn = min(minn, wt[v]);
            ins[v] = false;
            bel[v] = cnt;
            stk.pop();
            if (u == v) break;
        }
        fmp[cnt].in = minn;
        fmp[cnt].out = maxn;
    }
}
/*void dfs2(int x) {
    for (auto y : mp2[x]) {
        if (fmp[y].in > fmp[x].in) fmp[y].in = fmp[x].in;
        dp[y] = max(dp[y], max(dp[x], fmp[y].out - fmp[y].in));
        dfs2(y);
    }
}*/
int rd[2 * N];
void solve() {
    queue<int> st;
    st.push(bel[1]);
    while (!st.empty()) {
        int x = st.front();
        st.pop();
        for (auto y : mp2[x]) {
            if (fmp[y].in > fmp[x].in) fmp[y].in = fmp[x].in;
            dp[y] = max(dp[y], max(dp[x], fmp[y].out - fmp[y].in));
            rd[y]--;
            if (rd[y] == 0) st.push(y);
        }
    }
}
int main() {
    cin >> n >> m;
    cnt = n;
    for (int i = 1; i <= n; i++) cin >> wt[i];
    for (int i = 1; i <= m; i++) {
        int a, b, od; cin >> a >> b >> od;
        mp[a].push_back(b);
        if (od == 2) mp[b].push_back(a);
    }
    dfs(1);

    for (int i = 1; i <= n; i++) {
        for (auto x : mp[i]) {
            if (bel[x] == bel[i]) continue;
            if (ct[{bel[x], bel[i]}] || ct[{bel[i], bel[x]}]) continue;
            ct[{bel[x], bel[i]}] = ct[{bel[i], bel[x]}] = true;
            rd[bel[x]]++;
            mp2[bel[i]].push_back(bel[x]);
        }
    }
    
    //dfs2(bel[1]);
    solve();
    cout << dp[bel[n]];
    return 0;
}

 

标签:缩点,cnt,int,NOIP2009,fmp,st,low,P1073,dp
From: https://www.cnblogs.com/Aacaod/p/17034828.html

相关文章

  • NC16611 [NOIP2009]最优贸易
    题目链接题目题目描述C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这m条道路中有一部分为单向通行的道......
  • [NOIP2009 普及组] 多项式输出
    [NOIP2009普及组]多项式输出题目描述一元$n$次多项式可用如下的表达式表示:$$f(x)=a_nxn+a_{n-1}x{n-1}+\cdots+a_1x+a_0,a_n\ne0$$其中,$a_ix^i$称为$i$次项,$a......
  • AcWing341. 洛谷P1073, NOIP2009 最优贸易
    AcWing题目传送门洛谷题目传送门题目大意\(~~~~~~\)一个投机倒把的奸商想要通过城市不太健全的贸易系统坑点钱,任意城市都可以买入或者卖出水晶球,他想尽量在便宜的城市买......
  • P3387 缩点
     缩点求DAG最长路#include<bits/stdc++.h>usingnamespacestd;constintN=1e4+2;intn,m,pool,a[N];intlow[N],dfn[N];intkcnt,id[N];intf[N],v......
  • P3387 【模板】缩点
    #include<iostream>#include<queue>#include<vector>usingnamespacestd;constintN=1e4+1;intn,m;vector<int>to[N];intval[N];voidadd......
  • 三阶交调与1dB压缩点
    三阶交调与1dB压缩点来源 https://rf.eefocus.com/article/id-335281 任何半导体器件都具有一定的非线性,尤其在大信号输入情况下,非线性将更加明显。由于放大器具有一......
  • LOJ #2589. 「NOIP2009」Hankson 的趣味题
    题目链接:​​传送门​​分析题目要求,,也就是说是的因子,是的因子直接枚举(也就是的因子),另外一个就是然后满足上面两个条件的就,注意判断和相等的情况毫无技术含量#include<......
  • My University Is Better Than Yours (建图 + tj去环缩点 + 拓扑序 )
    题意:给你n所大学,给你m种类型的排名,问你有每一所大学可以比其他多少个大学大,将所有排名都累计上思路:一开始想用bitset做,但是空间爆了根据题意来建图,转化为......
  • P3387 【模板】缩点
    P3387我的做法就是将原图缩点,得到一个DAG新图,在新图上进行DP求最长路径。1#include<bits/stdc++.h>2usingnamespacestd;3constintN=1e5+10;4intn,......
  • 洛谷——P1071 [NOIP2009 提高组] 潜伏者
    本次博客,我将记录洛谷P1071潜伏者[NOIP2009提高组]潜伏者理解题意:对于failed的情况,有以下三种:1.扫描完毕后发现某个字母没有对应的翻译2.扫描过程中发现自相矛盾,这......