博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[SDOI2009]Elaxia的路线
阅读量:6237 次
发布时间:2019-06-22

本文共 2214 字,大约阅读时间需要 7 分钟。

Description

Solution

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

Code

#include 
#include
#include
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
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

你可能感兴趣的文章
通过反射,获取有参数的构造方法并运行
查看>>
SQL Server中使用convert进行日期转换
查看>>
通过PHP获取文件创建与修改时间
查看>>
数据行转列实例
查看>>
vs2010 CWnd::CreateEx Warning: Window creation failed: GetLastErro
查看>>
php monolog 的写日志到unix domain socket 测试终于成功
查看>>
kernel笔记——定时器与时间管理
查看>>
PyDev:warning: Debugger speedups using cython not foun
查看>>
APScheduler(Python化的Cron)使用总结 定时任务
查看>>
原始套接字简单应用
查看>>
单引号、双引号和三双引号的区别
查看>>
Eclipse快捷键大全(转载)
查看>>
Ambari服务依赖关系图生成脚本
查看>>
命令模式
查看>>
通过简单的mdev -s自动装配/dev目录下的设备文件
查看>>
[转]模态对话框与非模态对话的几种销毁方法与区别
查看>>
管理对象空间——段
查看>>
Storm - Guaranteeing message processing
查看>>
I.MX6 sdio 设备注册及识别
查看>>
获取股票数据的2个简单方法
查看>>