<题目链接>

题目大意:
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 学习- 10 -- 类和结构体

    // '类和结构体' 是人们构建代码所使用的一种通用且灵活的构造体, 我们可以使用完全相同的语法规则来为 '类和结构体' 定义属性 (变量 和 常量) 和添加方法, 从而扩展 类和结构体 的功能 // ...

  2. kafka消息的分发与消费

    关于 Topic 和 Partition: Topic: 在 kafka 中,topic 是一个存储消息的逻辑概念,可以认为是一个消息集合.每条消息发送到 kafka 集群的消息都有一个类别.物理上来 ...

  3. phpmyadmin 安装

    首先,安装mysql $ sudo apt-get install mysql-server$ sudo apt-get install mysql-client安装时输出root用户的密码在安装ph ...

  4. java和python对比----1:

    对计算来说: java 除法: 3/4 ==0; pyhton 除法: 3/4 ==0 3//4==0.75

  5. tomcat启动报错:Annotation-specified bean name 'patrolTrailServiceImpl' for bean class [cn.oppo.inventoryService.patrolTrailServiceImpl] con

    注释-为bean类[目录服务patrolTrailServiceImpl]指定的bean名称“patrolTrailServiceImpl”与同名和[目录服务patrolTrailServiceImp ...

  6. jenkins 回滚发布

    #jenkins拉取文件路径 workspace=/data/wos/testtemp #备份路径 backspace=/data/wos/back #不能提Git的文件 config=/data/w ...

  7. AI-序列化-查-做接口

    序列化最终代码(下边的可以不看) from rest_framework.views import APIView from rest_framework import serializers fro ...

  8. OOP和面向对象

    OOP具有三大特点 1.封装性:也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法.于是开发人员只 需要关注这个类如何使用,而不用去关 ...

  9. oracle安装过程中先决条件检查失败的解决办法

    1:公司数据库开始用的mysql,因为公司做的是保密性项目,所以就在项目日志过多的时候项目有爆炸的迹象啊(3000千万数据,貌似mysql有点撑不住).然后组长开始让我安装oracle,公司的内网也是 ...

  10. CentOS安装CAS 5.3.4服务端

    1.安装jdk1.8 https://www.cnblogs.com/kgdxpr/p/6824093.html 2.安装tomcat8 3.安装maven https://www.cnblogs.c ...