Nowcoder contest 370H Rinne Loves Dynamic Graph【分层图最短路】
<题目链接>
题目大意:
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【分层图最短路】的更多相关文章
- Nowcoder contest 370B Rinne Loves Graph 【分层图最短路】
<题目链接> 题目大意: Island 是有一些奇怪的城镇和道路构成的(题目需要,游戏党勿喷),有些城镇之间用双向道路连接起来了,且每条道路有它自己的距离.但是有一些城镇已经被派兵戒严,虽 ...
- Nowcoder contest 370F Rinne Loves Edges (简单树形DP) || 【最大流】(模板)
<题目链接> 题目大意: 一个 $n$ 个节点 $m$ 条边的无向连通图,每条边有一个边权 $w_i$.现在她想玩一个游戏:选取一个 “重要点” S,然后选择性删除一些边,使得原图中所有除 ...
- poj3635Full Tank?[分层图最短路]
Full Tank? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7248 Accepted: 2338 Descri ...
- HDU 5669 线段树优化建图+分层图最短路
用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...
- BZOJ 2763 分层图最短路
突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 #include <cstdio> #include <algorithm> #include ...
- 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)
[题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...
- 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)
[题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...
- BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路
BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路 Description “我要成为魔法少女!” “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切, ...
- BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路
BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M ...
随机推荐
- jenkins 安装网址
https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins
- Weblogic12c 单节点安装
第一节weblogic12c 的安装 WebLogic除了包括WebLogic Server服务器之外,还包括一些围绕WebLogic的产品,习惯上我们说的WebLogic是指WebLogic S ...
- Confluence 6 重新获得附件指南
每一个文件在恢复上传到 Confluence 的时候必须单独重命名,你可以通过下面说明的 3 个方法中选择一个进行操作: 选择 A - 通过文件名恢复附件 如果你知道你需要恢复的每一个文件名,尤其是你 ...
- flutter No material widget found textfield widgets require a material widget ancestor
Error states that TextField widgets require a Material widget ancestor. Simply wrapping your whole l ...
- 自动把动态的jsp页面(或静态html)生成PDF文档,并且上传至服务器
置顶2017年11月06日 14:41:04 阅读数:2311 这几天,任务中有一个难点是把一个打印页面自动给生成PDF文档,并且上传至服务器,然而公司框架只有手动上传文档,打印时可以保存为PDF在本 ...
- 51 Nod 1079 中国剩余定理(孙子定理)NOTE:互质情况
1079 中国剩余定理 一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K.例如,K % 2 = 1, K % 3 = 2, K % 5 = 3.符合条件的最小的K = 23. 收起 ...
- Python入门:求1-2+3-4+5...99的所有数的和
num =1 sum =0 while num <=99: if num % 2 ==1: sum = sum + num num =num +1 print(sum) 2.求1-2+3-4+5 ...
- 去掉A标签的点击选中边框
非IE a:focus { outline:none; }
- .Net(C#)用正则表达式清除HTML标签(包括script和style),保留纯本文(UEdit中编写的内容上传到数据库)
去官网下载,本Demo用的MVC模式 下载地址:http://ueditor.baidu.com/website/download.html 加入文件夹中的结构: 引入了函数公式的图标: @{ Vie ...
- Windows10系统运行bat文件 一闪而过 解决
1.在*.bat所在的文件夹按住shift 键然后鼠标右键,选择“在此处打开命令窗口”, 2.输入bat文件名称然后回车 这样就不会自动消失