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

[SDOI2009]Elaxia的路线

Description

Luogu2149
BZOJ1880

Solution

要求最短路径的最长公共部分,我是先跑了一遍从\(x_1\)\(y_1\)的最短路,然后把\(x_1\)\(y_1\)最短路上的边染色。再跑一遍\(x_2\)\(y_2\)的最短路,只不过这次的"边权"改为一对数:边的长度和边在第一次最短路中的长度。然后迪杰斯特拉跑的时候堆里先比较最短路长度,短的先出,如果最短路长度一样,在比较和之前重叠的长度,长的先出。

Code

#include <cstdio>
#include <cstring>
#include <queue>

typedef long long ll;

const int N = 1510;
const int M = N * (N - 1);

struct state {
    int x, y;
    state(int x = 0, int y = 0) : x(x), y(y) {}
    bool operator>(const state& a) const {
        return x == a.x ? y < a.y : x > a.x;
    }
    state operator+(const state& a) const { return state(x + a.x, y + a.y); }
    bool operator==(const state& a) const { return x == a.x && y == a.y; }
    bool operator<(const state& a) const { return !(*this == a || *this > a); }
} dis[N], w[M];
int vis[N], hd[N], to[M], nxt[M], cnt = 1, n, m, fl[M];

inline void adde(int x, int y, int z) {
    to[++cnt] = y;
    nxt[cnt] = hd[x];
    w[cnt].x = z;
    hd[x] = cnt;
}

struct node {
    int p;
    state d;
    node(int p = 0, state d = state(0, 0)) : p(p), d(d) {}
    bool operator<(const node& x) const { return d > x.d; }
};
std::priority_queue<node> q;
void dij(int s) {
    for (int i = 1; i <= n; ++i) dis[i] = state(0x3f3f3f3f, 0), vis[i] = 0;
    q.push(node(s, dis[s] = state(0, 0)));
    while (!q.empty()) {
        node x = q.top();
        q.pop();
        if (vis[x.p]) continue;
        vis[x.p] = 1;
        for (int i = hd[x.p]; i; i = nxt[i])
            if (!vis[to[i]]) {
                if (dis[to[i]] > x.d + w[i])
                    q.push(node(to[i], dis[to[i]] = x.d + w[i]));
            }
    }
}

void dfs(int x) {
    // printf("%d\n", x);
    for (int i = hd[x]; i; i = nxt[i]) {
        if (dis[to[i]] + w[i] == dis[x]) {
            w[i].y += w[i].x;
            w[i ^ 1].y += w[i].x;
            dfs(to[i]);
        }
    }
}

int main() {
    scanf("%d%d", &n, &m);
    int x1, y1, x2, y2;
    scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
    for (int i = 1, x, y, z; i <= m; ++i) {
        scanf("%d%d%d", &x, &y, &z);
        adde(x, y, z);
        adde(y, x, z);
    }
    dij(x1);
    // printf("%d %d\n", dis[y1].x, dis[y1].y);
    dfs(y1);
    dij(x2);
    printf("%d\n", dis[y2].y);
    return 0;
}

转载于:https://www.cnblogs.com/wyxwyx/p/sdoi2009ela.html

相关文章:

  • ES学习笔记(12)--Symbol
  • Redis 中的布隆过滤器
  • json字符串 转换为数组
  • 用mpvue开发微信小程序
  • hadoop副本放置策略
  • 【逆序对】N*M Puzzle / Simple Puzzle
  • JavaCV cvEstimateRigidTransform函数使用心得
  • 10.17_T1 平津战役
  • EOS开发完全解析(二):用cleos命令行创建、导入、解锁钱包
  • 返回一个二维整数数组中最大子数组的和
  • 1、jeecg 笔记开篇
  • 论文笔记:Visual Semantic Navigation Using Scene Priors
  • InlineHookPsTerminateProcess(0环)
  • 人工智能会改变世界?那这项技能你必须要掌握了。
  • 如何洞悉城市人群移动规律?DataV海量轨迹可视化实践解析
  • SegmentFault for Android 3.0 发布
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【剑指offer】让抽象问题具体化
  • CentOS6 编译安装 redis-3.2.3
  • chrome扩展demo1-小时钟
  • DataBase in Android
  • Debian下无root权限使用Python访问Oracle
  • iOS编译提示和导航提示
  • Java知识点总结(JavaIO-打印流)
  • LeetCode29.两数相除 JavaScript
  • node.js
  • Object.assign方法不能实现深复制
  • storm drpc实例
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue.js 移动端适配之 vw 解决方案
  • 回流、重绘及其优化
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 推荐一个React的管理后台框架
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 我是如何设计 Upload 上传组件的
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • Android开发者必备:推荐一款助力开发的开源APP
  • ionic入门之数据绑定显示-1
  • ionic异常记录
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #if #elif #endif
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (力扣题库)跳跃游戏II(c++)
  • (六)c52学习之旅-独立按键
  • (三)elasticsearch 源码之启动流程分析
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (一)UDP基本编程步骤
  • *2 echo、printf、mkdir命令的应用
  • .NET 8.0 中有哪些新的变化?