首页 > 其他分享 >Codeforces Round 933 G. Rudolf and Subway

Codeforces Round 933 G. Rudolf and Subway

时间:2024-03-18 12:32:43浏览次数:30  
标签:10 ll add Subway 933 op Rudolf wz 虚点

原题链接:Problem - G - Codeforces

思路:根据题意可知相同颜色的边一定是联通的,那么就可以设置虚点,例如1-2,2-3,3-4边的颜色都是相同的,那么就可以设置一个特殊的点例如设置为10,那么这三条边就可以改成1-10,10-2,2-10,10-3,3-10,10-4,从点到虚点需要1的代价,但是从虚点到其他点不需要代价,例如:不经过虚点从1-4,只需要1的代价,经过虚点也只要1的代价,所以可以使用虚点建图来跑最短路算法。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const int N=1e6+10;
ll h[N],e[N],ne[N],w[N],idx,d[N],st[N];
void add(ll a,ll b,ll c)
{
    e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
int main()
{
    ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
    ll t;cin>>t;
    while(t--)
    {
        ll n,m;cin>>n>>m;
        for(int i=0;i<=n+10;i++)//初始化 
        {
            st[i]=0;
            d[i]=1e18;
            h[i]=-1;
        }
        idx=0;
        map<ll,ll> op;//给每个颜色编号 
        ll wz=1;
        while(m--)
        {
            ll a,b,c;cin>>a>>b>>c;
            if(op[c]==0)//如果这个颜色没有出现过,那么就给最高颜色分配一个虚点,因为是多组数据,所以需要先初始化 
            {
                h[wz+n]=-1;//如果出现一个颜色那么它的点就应该是n+wz,因为题目要求有n个点,这样就不会和其他点冲突 
                st[wz+n]=0;
                d[wz+n]=1e18;
                op[c]=wz++;
            }
            add(a,op[c]+n,1);//从当前点到虚点需要1的代价 
            add(op[c]+n,a,0);//从虚点到其他点不需要代价 
            add(b,op[c]+n,1);//建立双向边 
            add(op[c]+n,b,0);
        }
        ll l,r;cin>>l>>r;
        priority_queue<pii,vector<pii>,greater<pii>> q;
        q.push({0,l});
        d[l]=0;
        while(q.size())//跑最短路 
        {
            ll a=q.top().first,b=q.top().second;
            q.pop();
            if(st[b])continue;
            st[b]=1;
            for(ll i=h[b];~i;i=ne[i])
            {
                ll j=e[i];
                //cout<<b<<' '<<j<<' '<<w[i]<<endl;
                if(d[j]>a+w[i])
                {
                    d[j]=a+w[i];
                    q.push({d[j],j});
                }
            }
        }
        cout<<d[r]<<endl;
    }
    return 0;
}

标签:10,ll,add,Subway,933,op,Rudolf,wz,虚点
From: https://blog.csdn.net/qq_74190237/article/details/136791342

相关文章

  • CF933-Div3 大致思路+题解
    A-RudolfandtheTicket纯水题暴力枚举直接过$code$#include<bits/stdc++.h>#definefo(x,y,z)for(int(x)=(y);(x)<=(z);(x)++)#definefu(x,y,z)for(int(x)=(y);(x)>=(z);(x)--)inlineintqr(){ charch=getchar();intx=0,f=1; for(;ch<'0......
  • cfRound933div3-E题解
    E-RudolfandkBridges题意:选择的桥在连续的行中,每个桥的支架安装位置是可以不一样的.做法:赛时也感觉也感觉是dp,但是害怕dp,就选择了逃避.往贪心方向想,认为每次到了每个跳板都要跳到最远距离,实际上这样是不行的.很明显,可能存在近一点的点花费更少。实际上是dp,而且也不......
  • Codeforces Round 933 Rudolf and k Bridges
    原题链接:Problem-E-Codeforces题目大意:给一个行为n列为m的河流二维数组,数字代表河流的深度。题目要求连续建造k座桥,桥的定义是从第一列到第m列,每隔d需要按照支架,安装支架的代价是深度+1。问安装最少需要多少代价?思路:单调队列优化dp,dp数组只需要一维,dp[i]的含义是从1到i建......
  • B. Rudolf and 121
    题解由于a1的值只能通过对a2的操作进行消除,所以我们可以先根据a1的值迭代出a2,a3的值,然后此时的a2,只能通过a3的操作进行消除.....以此类推,如果其中发现有ai的值<0就输出NO。code #include<bits/stdc++.h>usingnamespacestd;constintN=2e5+5;inta[N];intmain(){//......
  • C. Rudolf and the Ugly String
    题解遇到map时,sum++;遇到pie时,sum++。特殊情况遇到mapie时,sum--(因为map,pie分别加了一次,但是该子串只需要去掉p即可)code #include<bits/stdc++.h>usingnamespacestd;constintN=2e5+5;inta[N];intmain(){//freopen("input.txt","r",stdin);intt;ci......
  • A. Rudolf and the Ticket
    题解简单的二分应用,对于每个bi我们只需找到最大的ci使得bi+ci<=target即可code #include<bits/stdc++.h>usingnamespacestd;inta[105],b[105];intmain(){//freopen("input.txt","r",stdin);intt;cin>>t;while(t--){int......
  • G. Rudolf and Subway
    原题链接题解太巧妙了!!原题等效于该分层图,然后广搜本题中我用了另一种方法建边,因为清空太麻烦了code#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);intt;cin>>t;while(t--)......
  • F. Rudolf and Imbalance
    原题链接题解最大值最小\(\to\)二分可行性判断:二分间断值\(len\\to\)如果原序列\(a_i-a_{i-1}>len\)\(\to\)双指针判断有没有\(b+f\)使得\(a_i-len<=b+f<=a_{i-1}+len\)由于只能使用一次,所以若使用两次也算错code#include<bits/stdc++.h>usingnamespacestd;......
  • 3.14 CF Round 933 (Div. 3)
    (1)CF1941BRudolfand121给定一个长度为\(n\)的序列\(a\)。求最少进行多少次操作后所有\(a_i=0\):选择一个\(2\lei<n\),并让\(a_i\getsa_i-2,a_{i-1}\getsa_{i-1}-1,a_{i+1}\getsa_{i+1}-1\)。我们记选择\(i=x\)时的操作为\(\opera......
  • Codeforces Round 933 (Div. 3)赛后总结
    CodeforcesRound933(Div.3)B从边缘开始计算,因为边缘肯定只能一个一个减,就可以遍历得到答案.代码C只要对mapie特判,然后判断map和pie的个数就是答案了。D(记忆化搜索)可以通过二维数组来标记搜索状态,将已经出现过的状态直接返回,极大减少时间。#include<bits/stdc++.h>......