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

G. Rudolf and Subway

时间:2024-04-06 14:55:20浏览次数:16  
标签:int back cin vis Subway push Rudolf

 原题的无向图等价于上图所示的联通图,此时我们要求的就是起始位置到终止位置最少要经过几个有颜色的结点。

code

 

#include<bits/stdc++.h>
using namespace std;
const int N=4e5+5;
int vis[N];
int main(){
//    freopen("input.txt","r",stdin);
    int t;
    cin>>t;
    while (t--){
        int n,m;
        cin>>n>>m;
        map<int,vector<int> > G;
        for (int i=1;i<=m;i++){
            int u,v,c;
            cin>>u>>v>>c;
            c+=n;
            vis[u]=-1;
            vis[v]=-1;
            vis[c]=-1;
            G[u].push_back(c);
            G[v].push_back(c);
            G[c].push_back(u);
            G[c].push_back(v);
        }
        queue<int> que;
        int b,e;
        cin>>b>>e;
        if (b==e) {
            cout<<0<<endl;
            continue;
        }
        vis[b]=0;
        que.push(b);
        while (!que.empty()){
            int x=que.front();
            que.pop();
            if (x==e) break;
            for (auto Next : G[x]){
                if (vis[Next]==-1){
                    vis[Next]=vis[x]+1;
                    que.push(Next);
                }
            }
        }
        cout<<vis[e]/2<<endl;
    }
    return 0;
}

 

标签:int,back,cin,vis,Subway,push,Rudolf
From: https://www.cnblogs.com/purple123/p/18117442

相关文章

  • [Rudolf and Subway]
    RudolfandSubway题目大意给定一个\(n\)个点,\(m\)条边的无向图,第\(i\)条边表示\(x,y\)是\(z\)号线的相邻站点,问\(s\)到\(t\)最少需要换乘多少次做法用分层图,对于任意一条线路,让他们单独分为一层,如果一个点既在\(1\)号线又在\(2\)号线,那么它应该处于两个图层中,举个例子441......
  • CF371E Subway Innovation 题解
    题目链接:CF或者洛谷对于绝对值的几何意义来说,这题是在直线上的两点间的距离,为了总的距离和最下,首先最好让它们两两之间最好都紧挨着。由于询问的是\((i,j)\)不重不漏的对有关,即\((i<j)\+\(i>j)\+\(i=j)=all(i,j)\),又因为,\((i,j)\)的贡献和\((j,i)\)相同且重复,所以我......
  • 题解:CF1941G Rudolf and Subway
    原题链接简化题意一个无向连通图中将边分成了不同颜色(保证同种颜色联通),问从\(b\)到\(e\)最短需要经过几种颜色思路考虑因为同种颜色联通,可直接在读入的时候开两个vector分别存每个点属于的颜色及每种颜色有哪些点,又因为颜色数字可能跨度比较大,最好另开一个存颜色的种......
  • D. Rudolf and the Ball Game
    题解:模拟+去重每一次扔球都将所有可能性加入队列,并设为一层;然后将一层的可能性挨个出列并进行 ((qj+ri−1) mod n+1),((qj−ri−1+n) mod n+1)操作,然后去重后入列。code #include<bits/stdc++.h>usingnamespacestd;constintN=2e5+5;inta[N],b[1005];intmain()......
  • Codeforces Round 933 G. Rudolf and Subway
    原题链接:Problem-G-Codeforces思路:根据题意可知相同颜色的边一定是联通的,那么就可以设置虚点,例如1-2,2-3,3-4边的颜色都是相同的,那么就可以设置一个特殊的点例如设置为10,那么这三条边就可以改成1-10,10-2,2-10,10-3,3-10,10-4,从点到虚点需要1的代价,但是从虚点到其他点不需要代价,......
  • 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--)......