当前位置: 首页 > news >正文

最短路问题

Problem - D - Codeforces(最短路,反向bfs)

题目:

思路:

bfs版本:参考自Codeforces Round 1002 (Div. 2) A - D - 知乎

代码:

dijstra:

void solve()
{
    int n;
    cin>>n;
    int s1, s2;
    cin>>s1>>s2;
    s1--, s2--;
    vector<vector<int>> adj1(n), adj2(n);
    int m1, m2;
    cin>>m1;
    vector<PII> edj1(m1);
    for(int i=0, u, v; i<m1; i++){
        cin>>u>>v;
        u--, v--;
        if(u>v) swap(u,v);
        edj1[i]={u,v};
        adj1[u].emplace_back(v);
        adj1[v].emplace_back(u);
    }
    cin>>m2;
    vector<PII> edj2(m2);
    for(int i=0, u, v; i<m2; i++){
        cin>>u>>v;
        u--, v--;
        if(u>v) swap(u,v);
        edj2[i]={u,v};
        adj2[u].emplace_back(v);
        adj2[v].emplace_back(u);
    }
    vector<vector<int>> d(n,vector<int>(n,1e9+7));
    priority_queue<array<int,3>,vector<array<int,3>>,greater<array<int,3>>> q;
    for(auto [u1,v1]:edj1){
        for(auto [u2,v2]:edj2){
            if(u1==u2 && v1==v2){
                q.push({0,u1,u1});
            }
        }
    }
    vector<vector<bool>> vis(n,vector<bool>(n, false));
    int res=-1;
    while(!q.empty()){
        auto [d, u1, u2]=q.top();
        q.pop();
        if(vis[u1][u2]) continue;
        vis[u1][u2]=true;
        if(u1== s1 && u2== s2){
            res=d;
        }
        d+=abs(u1-u2);
        for(auto v1:adj1[u1]){
            for(auto v2: adj2[u2]){
                q.push({d,v1,v2});
            }
        }
    }
    cout<<res<<'\n';
}

反向bfs: 

void solve()
{
    int n;
    cin>>n;
    int s1, s2;
    cin>>s1>>s2;
    s1--, s2--;
    vector<vector<int>> adj1(n), adj2(n);
    int m1, m2;
    cin>>m1;
    for(int i=0, u, v; i<m1; i++){
        cin>>u>>v;
        u--, v--;
        if(u>v) swap(u,v);
        adj1[u].emplace_back(v);
        adj1[v].emplace_back(u);
    }
    cin>>m2;
    for(int i=0, u, v; i<m2; i++){
        cin>>u>>v;
        u--, v--;
        if(u>v) swap(u,v);
        adj2[u].emplace_back(v);
        adj2[v].emplace_back(u);
    }
    vector<vector<int>> dis(n,vector<int>(n,-1));
    priority_queue<array<int,3>,vector<array<int,3>>,greater<array<int,3>>> q;
    q.push({0,s1,s2});
    int res=-1;
    while(!q.empty()){
        auto [d,u1,u2]=q.top();
        q.pop();
        if(dis[u1][u2]!=-1) continue;
        dis[u1][u2]=d;

        for(int v1:adj1[u1]){
            for(int v2:adj2[u2]){
                if(u1==u2 && v1==v2){
                    res=d;
                    cout<<res<<'\n';
                    return;
                }
                q.push({d+abs(v1-v2),v1,v2});
            }
        }
    }
    cout<<res<<'\n';
}

相关文章:

  • linux上配置免密登录
  • 【每日五题系列】前端面试高频题目
  • VSCode 配置优化指南:打造极致高效的前端开发环境
  • 如何高效使用 Mybatis-Plus 的批量操作
  • java中小型公司面试预习资料(一):基础篇
  • python文本处理pdfminer库安装与使用
  • ZYNQ-PL学习实践(五)IP核之FIFO
  • Oracle SQL优化实战要点解析(11)——索引、相关子查询及NL操作(1)
  • Gartner发布2025年网络安全六大预测
  • PROFINET转PROFIBUS从案例剖析网关模块的协议转换功能
  • 蓝桥杯备赛:每日一题
  • 数据库两个表数据同步的核心方案与深度实践
  • Linux 下的 Docker 安装与使用
  • 第十五届蓝桥杯----B组cpp----真题解析(小白版本)
  • 给没有登录认证的web应用添加登录认证(openresty lua实现,代码已完善)
  • 迷你世界脚本自定义UI接口:Customui
  • NO.28十六届蓝桥杯备战|string|insert|find|substr|关系运算|stoi|stol|stod|stof|to_string(C++)
  • 蓝桥杯 封闭图形个数
  • NanoMQ ds笔记250306
  • Vue进阶之Vue3源码解析(三)
  • 高端网站的制作/全网营销推广案例
  • 批发网站大全最便宜卖1688/高明搜索seo
  • 开发票有什么用/宁波优化网站厂家
  • 夏邑好心情网站建设有限公司/平台推广销售话术
  • 网站建设怎么做账务处理/百度app下载
  • 做特价网站/游戏优化是什么意思