<题目链接>

题目大意:
Rinne 学到了一个新的奇妙的东西叫做动态图,这里的动态图的定义是边权可以随着操作而变动的图。当我们在这个图上经过一条边的时候,这个图上所有边的边权都会发生变动。定义变动函数 f(x)=1/(1−x),表示我们在图上走过一条边后,图的边权变动情况。这里指的“图的变动”的意思是将每条边的边权代入上函数,得到的值即为该次变动后的边权。现在 Rinne 想要知道,在这个变动的图上从 1 到 n 的最短路径。因为 Rinne 不喜欢负数,所以她只需要你输出经过的边权权值绝对值之和最小的那个值就可以了。输出答案保留三位小数。

解题分析:

所谓动态图,其实就是你走到这个点所对应的步数不同,图的边权所对应的值也随之发生改变。我们仔细观察这个函数,手动推导几项之后发现,该函数是一个周期变化的函数,并且周期为3。很明显本题就被转化成为了一个分层图最短路的模型,分成三层,分别对应到达该点步数%3的情况。并且,因为本题的边权都取绝对值,所以最好用Dijkstra(或者BFS,据说出题人卡SPFA,雾……)。

#include <bits/stdc++.h>
using namespace std; const int N = 1e5+, M = 3e5+;
#define clr(a,b) memset(a,b,sizeof(a))
#define rep(i,s,t) for(int i=s;i<=t;i++)
double dis[N][];
int n,m,cnt;
int head[N],vis[N][];
const double INF = 1e15;
struct Node{
int loc,lev;double dist;
Node(int _loc=,int _lev=,double _dist=0.0):loc(_loc),lev(_lev),dist(_dist){}
bool operator < (const Node &tmp)const { return tmp.dist<dist; }
}node[N][]; struct Edge{
int to,nxt;double w;
}edge[M<<]; inline void init(){ cnt=;clr(head,-); }
inline void addedge(int u,int v,double w){
edge[++cnt].to=v,edge[cnt].nxt=head[u];
edge[cnt].w=w,head[u]=cnt;
} inline double cal(double x,int tp){ //该函数是一个以3为周期的周期函数,并且记得取绝对值
if(tp==)return x*1.0;
if(tp==)return fabs(/(1.0-x));
return fabs(-1.0/x);
}
inline void Dij(){
rep(i,,n) rep(j,,){
node[i][j].loc=i,node[i][j].lev=j;
node[i][j].dist=INF;vis[i][j]=;
}
priority_queue<Node>q;
node[][].dist=;
q.push(node[][]); //因为题目是说经过一条边后,图上边的权值才发生改变,所以这里从node[1][2]开始,即起始点走了一条边之后,图的边权边权才发生改变
while(!q.empty()){
Node now=q.top();q.pop();
int tmp1=now.loc,tmp2=now.lev;
if(vis[tmp1][tmp2])continue;
vis[tmp1][tmp2]=;
for(int i=head[tmp1];~i;i=edge[i].nxt){
int v=edge[i].to;double cost=edge[i].w;
if(node[v][(tmp2+)%].dist>node[tmp1][tmp2].dist+cal(cost,(tmp2+)%)){
node[v][(tmp2+)%].dist=node[tmp1][tmp2].dist+cal(cost,(tmp2+)%);
q.push(Node(v,(tmp2+)%,node[v][(tmp2+)%].dist));
}
}
}
}
int main(){
init();scanf("%d%d",&n,&m);
rep(i,,m){
int u,v;double w;scanf("%d%d%lf",&u,&v,&w);
addedge(u,v,w);addedge(v,u,w);
}
Dij();
double ans=INF;
rep(i,,) ans=min(ans,node[n][i].dist); //printf("%.3lf\n",node[n][i].dist);
if(ans==INF)puts("-1");
else printf("%.3lf\n",ans);
}

Nowcoder contest 370H Rinne Loves Dynamic Graph【分层图最短路】的更多相关文章

  1. Nowcoder contest 370B Rinne Loves Graph 【分层图最短路】

    <题目链接> 题目大意: Island 是有一些奇怪的城镇和道路构成的(题目需要,游戏党勿喷),有些城镇之间用双向道路连接起来了,且每条道路有它自己的距离.但是有一些城镇已经被派兵戒严,虽 ...

  2. Nowcoder contest 370F Rinne Loves Edges (简单树形DP) || 【最大流】(模板)

    <题目链接> 题目大意: 一个 $n$ 个节点 $m$ 条边的无向连通图,每条边有一个边权 $w_i$.现在她想玩一个游戏:选取一个 “重要点” S,然后选择性删除一些边,使得原图中所有除 ...

  3. poj3635Full Tank?[分层图最短路]

    Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7248   Accepted: 2338 Descri ...

  4. HDU 5669 线段树优化建图+分层图最短路

    用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...

  5. BZOJ 2763 分层图最短路

    突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 #include <cstdio> #include <algorithm> #include ...

  6. 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)

    [题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...

  7. 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)

    [题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...

  8. BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路

    BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路 Description “我要成为魔法少女!”     “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切, ...

  9. BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路

    BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M ...

随机推荐

  1. swift 学习- 26 -- 泛型

    // 泛型 代码能够让你根据自定义的需求,编写出适用于任意类型, 灵活可重用的函数以及类型, 它能让你避免代码的重复, 用一种清晰和抽象的方式来表达代码的意图 // 泛型是 Swift 最强大的特性之 ...

  2. 彻底完全卸载 SQL Server 2005 的图文教程

    彻底完全卸载 SQL Server 2005 的图文教程 SQL SERVER 2005不象SERVER 2000所有组件都汇总在一起,所以卸载时特别麻烦,如果不按正常的方法卸载,重新安装是不可能安装 ...

  3. RHCE认证考前辅导

    一一:Linux认证题库详细说明 注意事项 (1) RHCSA上午2.5小时,RHCE下午3.5小时,考生需对题目非常熟练. (2) 5样东西必带(身份证.1支黑色水笔.常用邮箱.姓名拼音.聪明的脑袋 ...

  4. pythonz之__new__与__init__

    new __new__是用来控制对象的生成过程,在对象生成之前 __init__是用来完善对象的 如果new方法不返回对象(return super().new(cls)),则不会调用init函数 c ...

  5. html固定表头,表单内容垂直循环滚动

    <!DOCTYPE html><html lang="zh-cn"><head>    <meta charset="utf-8 ...

  6. jmeter从CSV中获取非正常string

    jmeter从CSV中获取非正常string,如CSV中有一列值为{"firstname":"Jade"},那么在beanshell中如何获取并解析? 一般的用 ...

  7. CTPN项目部分代码学习

    上次拜读了CTPN论文,趁热打铁,今天就从网上找到CTPN 的tensorflow代码实现一下,这里放出大佬的github项目地址:https://github.com/eragonruan/text ...

  8. python杂写

    一:用户交互 与用户交互主要使用input,这里需要说明三点: 1:input会等待用户输入 2:会将输入的内容赋值给变量 3:input出的变量都是字符串类型(str) 例子1:注意,因为input ...

  9. h5在手机端实现简单复制

    <a href="https://blog-static.cnblogs.com/files/ruanqin/clipboard.min.js">下载clipborrd ...

  10. Python模块的导入以及软件开发规范

    Python文件的两种用途 1 . 当脚本直接使用,直接当脚本运行调用即可 def func(): print("from func1") func() 2 . 当做模块被导入使用 ...