<题目链接>

题目大意:
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. C# 通用数据库配置界面,微软原生DLL重整合

    C# 通用数据库配置界面,微软原生DLL重整合 自己整合了 微软自带的数据连接配置界面对话库    Microsoft.Data.ConnectionUI.Dialog.dll  微软自带的数据连接配 ...

  2. Confluence 6 其他 MBeans 和高 CPU 消耗线程

    其他 MBeans 希望监控 Hibernate 和 Hazelcast(仅针对 Confluence 数据中心)你需要在你的 setenv.sh / setenv.bat 文件中添加下面的内容. s ...

  3. Android源码分析二 硬件抽象层(HAL)

    一 什么是HAL HAL 可定义一个标准接口以供硬件供应商实现,这可让 Android 忽略较低级别的驱动程序实现.借助 HAL,您可以顺利实现相关功能,而不会影响或更改更高级别的系统.HAL 实现会 ...

  4. HTML5 缓存: cache manifest

    ---恢复内容开始--- 1:MIME TYPE:text/cache-manifest 服务器配置MIME类型2:需要由你创建的:NAME.manifest 创建manifest文件3:给 < ...

  5. 攻击WordPress和其他程序

    1.SAAS服务(Software as a Service )管理其他作为内容管理的一个人框架的软件,http://www.turnkeylinx.org 上发布了很多测试应用的程序.WordPre ...

  6. Python获取当前时间及时间转换(datetime)

    datetime是Python处理日期和时间的标准库 获取当前时间 import datetime day = datetime.datetime.now() day2 = datetime.date ...

  7. python SSL处理

    浏览器SSL提示 我们看一下IE的解决方案,对ie浏览器而言,需要添加Desired Capabilities的acceptSslCerts选项为True,代码如下: 的 112 / 166 #_*_ ...

  8. python3 HTMLTestRunner.py

    """ A TestRunner for use with the Python unit testing framework. It generates a HTML ...

  9. JSON数据写入和解析

    如何写入JSON 需要第三方jar包,JSON包 //写入json数据 public static String sendJson() { JSONObject json = new JSONObje ...

  10. ajax一次获取整个表单的数据

    $.ajax({ cache: true, type: "POST", url:ajaxCallUrl, data:$('#yourformid').serialize(),// ...