NC22600 Rinne Loves Dynamic Graph
题目
题目描述
Rinne 学到了一个新的奇妙的东西叫做动态图,这里的动态图的定义是边权可以随着操作而变动的图。
当我们在这个图上经过一条边的时候,这个图上所有边的边权都会发生变动。
定义变动函数 \(f(x) = \frac{1}{1-x}\) ,表示我们在图上走过一条边后,图的边权变动情况。
这里指的“图的变动”的意思是将每条边的边权代入上函数,得到的值即为该次变动后的边权。
现在 Rinne 想要知道,在这个变动的图上从 1 到 n 的最短路径。
因为 Rinne 不喜欢负数,所以她只需要你输出经过的边权权值绝对值之和最小的那个值就可以了。
输出答案保留三位小数。
输入描述
第一行两个正整数 N,M,表示这个动态图的点数和边数。
接下来 M 行,每行三个正整数 u,v,w,表示存在一条连接点 u,v 的无向边,且初始权值为 w。
输出描述
如果能到达的话,输出边权绝对值之和最小的答案,保留三位小数。
否则请输出 -1。
示例1
输入
3 3
1 2 2
2 3 2
3 1 3
输出
3.000
说明
走 \(1 \to 2 \to 3\) ,总花费 \(2 + |\frac{1}{1-2}| = 3\)
备注
\(n \leq 100000,m \leq 300000,2 \leq x \leq 1000\)
题解
知识点:最短路。
注意到,边权是一个周期变化 \(|x|,|\frac{1}{1-x}|,|1-\frac{1}{x}|,|x|,\cdots\) 。因此我们保存一个周期的边权跑最短路,再给 \(dis\) 加一个维度记录不同边权下的最短路。
时间复杂度 \(O((n+m)\log m)\)
空间复杂度 \(O(n+m)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
template<class T>
struct Graph {
struct edge {
int v, nxt;
T w;
};
int idx;
vector<int> h;
vector<edge> e;
Graph(int n, int m):idx(0), h(n + 1), e(m + 1) {}
void init(int n) {
idx = 0;
h.assign(n + 1, 0);
}
void add(int u, int v, const T &w) {
e[++idx] = edge{ v,h[u],w };
h[u] = idx;
}
};
const int N = 100000 + 7, M = 300000 + 7 << 1;
Graph<vector<double>> g(N, M);
int n, m;
bool vis[N][3];
double dis[N][3];
struct node {
int v, cnt;
double w;
friend bool operator<(const node &a, const node &b) {
return a.w > b.w;
}
};
priority_queue<node> pq;
double dijkstra(int st) {
for (int i = 1;i <= n;i++) dis[i][0] = dis[i][1] = dis[i][2] = 0x3f3f3f3f;
dis[st][0] = 0;
pq.push({ st,0,0 });
while (!pq.empty()) {
int u = pq.top().v, cnt = pq.top().cnt;
pq.pop();
if (u == n) return dis[u][cnt];
if (vis[u][cnt]) continue;
vis[u][cnt] = 1;
for (int i = g.h[u];i;i = g.e[i].nxt) {
int v = g.e[i].v;
double w = g.e[i].w[cnt];
if (dis[v][(cnt + 1) % 3] > dis[u][cnt] + w) {
dis[v][(cnt + 1) % 3] = dis[u][cnt] + w;
pq.push(node{ v,(cnt + 1) % 3,dis[v][(cnt + 1) % 3] });
}
}
}
return -1;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1;i <= m;i++) {
int u, v;
double w;
cin >> u >> v >> w;
g.add(u, v, { w,abs(1 / (1 - w)),abs(1 - 1 / w) });
g.add(v, u, { w,abs(1 / (1 - w)),abs(1 - 1 / w) });
}
double ans = dijkstra(1);
if (ans < 0) cout << -1 << '\n';
else cout << fixed << setprecision(3) << ans << '\n';
return 0;
}
NC22600 Rinne Loves Dynamic Graph的更多相关文章
- Nowcoder contest 370H Rinne Loves Dynamic Graph【分层图最短路】
<题目链接> 题目大意:Rinne 学到了一个新的奇妙的东西叫做动态图,这里的动态图的定义是边权可以随着操作而变动的图.当我们在这个图上经过一条边的时候,这个图上所有边的边权都会发生变动. ...
- HDU 6321 Dynamic Graph Matching
HDU 6321 Dynamic Graph Matching (状压DP) Problem C. Dynamic Graph Matching Time Limit: 8000/4000 MS (J ...
- hdu多校第3场C. Dynamic Graph Matching
Problem C. Dynamic Graph Matching Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Tot ...
- HDU6321 Dynamic Graph Matching【状压DP 子集枚举】
HDU6321 Dynamic Graph Matching 题意: 给出\(N\)个点,一开始没有边,然后有\(M\)次操作,每次操作加一条无向边或者删一条已经存在的边,问每次操作后图中恰好匹配\( ...
- 论文笔记:(2019)LDGCNN : Linked Dynamic Graph CNN-Learning on PointCloud via Linking Hierarchical Features
目录 摘要 一.引言 A.基于视图的方法 B.基于体素的方法 C.基于几何的方法 二.材料 三.方法 A.问题陈述 B.图生成 C.图特征提取 D.变换不变函数 E.LDGCNN架构 F.冻结特征提取 ...
- 论文笔记:(TOG2019)DGCNN : Dynamic Graph CNN for Learning on Point Clouds
目录 摘要 一.引言 二.相关工作 三.我们的方法 3.1 边缘卷积Edge Convolution 3.2动态图更新 3.3 性质 3.4 与现有方法比较 四.评估 4.1 分类 4.2 模型复杂度 ...
- 论文阅读 Dynamic Graph Representation Learning Via Self-Attention Networks
4 Dynamic Graph Representation Learning Via Self-Attention Networks link:https://arxiv.org/abs/1812. ...
- 论文阅读 dyngraph2vec: Capturing Network Dynamics using Dynamic Graph Representation Learning
6 dyngraph2vec: Capturing Network Dynamics using Dynamic Graph Representation Learning207 link:https ...
- Nowcoder contest 370B Rinne Loves Graph 【分层图最短路】
<题目链接> 题目大意: Island 是有一些奇怪的城镇和道路构成的(题目需要,游戏党勿喷),有些城镇之间用双向道路连接起来了,且每条道路有它自己的距离.但是有一些城镇已经被派兵戒严,虽 ...
- Nowcoder contest 370F Rinne Loves Edges (简单树形DP) || 【最大流】(模板)
<题目链接> 题目大意: 一个 $n$ 个节点 $m$ 条边的无向连通图,每条边有一个边权 $w_i$.现在她想玩一个游戏:选取一个 “重要点” S,然后选择性删除一些边,使得原图中所有除 ...
随机推荐
- React报错之ref返回undefined或null
正文从这开始~ 总览 当我们试图在其对应的DOM元素被渲染之前访问其current属性时,React的ref通常会返回undefined或者null.为了解决该问题,可以在useEffect钩子中访问 ...
- 使用Grafana 监控 minio 的部分改进
使用Grafana 监控 minio 的部分改进 部署minio开启监控metrics的脚本 mkdir -p /data/minio/data cat << EOF > /etc/ ...
- [转帖]是的你没看错,HTTP3来了
https://www.jianshu.com/p/288ce6a8ab88 简介 很多小伙伴可能还沉浸在HTTP1.1的世界无法自拔,但是时代的洪流已经带领我们来到了HTTP3的世界了.是的,你在桥 ...
- [转帖]s3fs
https://github.com/s3fs-fuse/s3fs-fuse s3fs allows Linux, macOS, and FreeBSD to mount an S3 bucket v ...
- 【转帖】Linux多链路聚合技术
https://www.jianshu.com/p/dd8587ecf54f 一般而言,在单体结构的操作系统中,一块物理磁盘会接在总线设备上,并经由总线分配 PCI-Bus 号,这个时候一个 bus ...
- 【发现一个问题】VictoriaMetrics中,突然某个时间段新增的data point无法查询出来
写了一个很简单的python程序,使用remote write协议发数据到vm-insert. 可是有个时段突然查询不出来数据了. 百思不得其解. 吃完中午饭,刷新页面又出来了. 还不清楚问题出现在哪 ...
- PaddleNLP基于ERNIR3.0文本分类:WOS数据集为例(层次分类)
相关项目链接: Paddlenlp之UIE模型实战实体抽取任务[打车数据.快递单] Paddlenlp之UIE分类模型[以情感倾向分析新闻分类为例]含智能标注方案) 应用实践:分类模型大集成者[Pad ...
- 14.3 Socket 字符串分块传输
首先为什么要实行分块传输字符串,一般而言Socket套接字最长发送的字节数为8192字节,如果发送的字节超出了此范围则后续部分会被自动截断,此时将字符串进行分块传输将显得格外重要,分块传输的关键在于封 ...
- 驱动开发:内核MDL读写进程内存
MDL内存读写是最常用的一种读写模式,通常需要附加到指定进程空间内然后调用内存拷贝得到对端内存中的数据,在调用结束后再将其空间释放掉,通过这种方式实现内存读写操作,此种模式的读写操作也是最推荐使用的相 ...
- Linux服务器Crontab定时任务配置
1.检查linux系统是否有crontab rpm -qa | grep crontab 2.如果未安装进行安装 yum -y install vixie-cron yum -y install cr ...