首页 > 其他分享 >P7831 [CCO2021] Travelling Merchant CWOI1113B

P7831 [CCO2021] Travelling Merchant CWOI1113B

时间:2023-11-13 17:26:36浏览次数:43  
标签:Merchant P7831 CCO2021 int CWOI1113B edge ans Travelling inf

首先将边反向,再按 \(r\) 从大到小排序,这样可以使得答案的转移没有后效性。
令 \(ans_i\) 表示 \(i\) 这个点最少有多少资产方能无限地走下去。(初值为 \(inf\) )
依次枚举每一条边。(令 \(u\) 为这条边的起点,\(v\) 为这条边的终点)

  • 首先对现在的图进行一遍 topo ,转移方程为 \(ans_v=min(ans_v,max(r,ans_u-p))\)(要求 \(ans_u\) 不为 \(inf\)) ,因为如果只考虑当前这条边的话,\(v\) 点的资产至少要为 \(r\) 才能走出去,而且必须要使走过这条边后的资产 \(\ge ans_u\) ,于是有了上面的方程。走过的边都要删掉。
  • 更新 \(ans_u=min(ans_u,r)\) ,删掉这条边,若点 \(u\) 入度为 \(0\) 则加入队列。

手动模拟一下这个过程,可以发现一个环的答案只会对后面的点有贡献,因此可以求出答案为 \(-1\) 的点。

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=2e5+5,inf=1e18;
int n,m,ans[N],d[N];
struct edge{
    int u,v,r,p;
    edge(){}
    edge(int u,int v,int r,int p):u(u),v(v),r(r),p(p){}
}e[N];
bool vis[N];
vector<int> g[N];

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for (int i=1;i<=m;i++)
    {
        int u,v,r,p;
        cin>>u>>v>>r>>p;
        e[i]=edge(u,v,r,p);
    }
    for (int i=1;i<=n;i++) ans[i]=inf;
    sort(e+1,e+1+m,[&](edge a,edge b){return a.r>b.r;});
    for (int i=1;i<=m;i++) g[e[i].v].emplace_back(i),d[e[i].u]++;
    queue<int> q;
    for (int i=1;i<=n;i++) if (!d[i]) q.push(i);
    for (int i=1;i<=m;i++)
    {
        while (!q.empty())
        {
            int u=q.front();
            q.pop();
            for (int nex:g[u])
            {
                if (vis[nex]) continue;
                vis[nex]=1;
                int v=e[nex].u;
                d[v]--;
                if (ans[u]!=inf) ans[v]=min(ans[v],max(e[nex].r,ans[u]-e[nex].p));
                if (!d[v]) q.push(v);
            }
        }
        if (vis[i]) continue;
        auto& [u,v,r,p]=e[i];
        vis[i]=1;
        d[u]--;
        ans[u]=min(ans[u],e[i].r);
        if (!d[u]) q.push(u);
    }
    for (int i=1;i<=n;i++) cout<<(ans[i]==inf?-1:ans[i])<<' ';
}

最难的部分在于想到从大到小贪心。

标签:Merchant,P7831,CCO2021,int,CWOI1113B,edge,ans,Travelling,inf
From: https://www.cnblogs.com/Fredericm/p/LuoguP7831CWOI1113B.html

相关文章

  • Codeforces 512D. Fox And Travelling 题解
    FoxAndTravelling题面翻译给定一张\(n\)个点\(m\)条边的无向图。一个点只有当与它直接相连的点中最多只有一个点未被选择过时才可被选择。询问对于每个\(k\in[0,n]\),有序选择\(k\)个点的方案数。\(n\le100\),\(m\le\frac{n(n-1)}2\),答案对\(10^9+9\)取模。......
  • Travelling Salesman and Special Numbers
    prologue模拟赛的一道题,结果没做出来,丢大人,败大兴。所以过来糊一篇题解。analysis我们看到数据范围这么大,那么肯定不可以一个一个遍历(废话),所以就要考虑这个题目的性质。我们先假设,极端数据\(2^{1000}-1\),这个数字中包含了\(999\)个1(正好感冒了能不能让我喝了)。下一次......
  • UVA10702 Travelling Salesman 题解
     UVA10702TravellingSalesman题解题面:有个旅行的商人,他每到一个的新城市,便卖掉所有东西再购买新东西,从而获得利润。从某城市A到某城市B有固定利润(B 到A 的利润可能不同)。已知城市可以重复到达,从S 点出发,经过T 个城市,有E个城市能作为终点,求最大的利润。先定义......
  • P7831 题解
    problem&blog。妙妙题。单杀了,来写篇题解。下文中\(ans_u\)表示从\(u\)点出发的答案。考虑直接做。发现更新任何一个点,都可能会对一堆点造成影响,\(O(n^2)\)无法接受。一些简单的性质:不能进入一个环的\(ans_u=-1\)。否则,对于\((u,v,r,p)\),\(r\)是最大的\(r\),那么只......
  • CF512D Fox And Travelling 题解--zhengjun
    计数好题。首先对于每个连通块独立考虑,最后合并答案。发现点数超过1的强连通分量一定删不掉。若连通块中存在点数超过1的强连通分量tarjan缩点之后,称这些点数超过1的强连通分量为关键点;那么两关键点之间的点也不能删;于是对于剩下的点直接dp即可,由于可删的子树......
  • POJ 3728 The merchant
    题意好像不清楚:给定一棵\(n​\)个点的树,每个点有点权\(val_i​\),现在有\(q​\)个询问,每次询问给出\(u,v​\),设\(u​\)到\(v​\)的路径上的点编号为\(a_1,a_2\cdotsa_{len}​\),求\(\max\limits_{1\lex<y\lelen}{val_{a_y}-val_{a_x}}​\)。因为\(x,y\)有顺......
  • 排序01背包 Problem W:Proud Merchants(HDU 3466)
    ProblemWTimeLimit:2000/1000ms(Java/Other)   MemoryLimit:131072/65536K(Java/Other)TotalSubmission(s):2   AcceptedSubmission(s):1ProblemDesc......
  • HDU 5402 Travelling Salesman Problem
    ProblemDescriptionn rowsand m columns.Thereisanon-negativenumberineachcell.TeacherMaiwantstowalkfromthetopleftcorner (1,1......
  • CodeForces - 914C Travelling Salesman and Special Numbers
    题意:给出一个二进制数a,每次操作将当前数变成其二进制下1的个数,若干次操作后可以将其变为1.给定k,求不大于a的数中,经过k次操作能变成1的数的数量。解:观察一下这个操作,可以求......
  • HDU 3466 Pround Merchants
    题目链接:​​传送门​​题面:ProudMerchantsProblemDescriptionRecently,iSeawenttoanancientcountry.Forsuchalongtime,itwasthemostwealthyandpow......