Run For Beer CF575G
Run for beer
CF 575G
如果直接bfs分层贪心可以做,但是很毒瘤,具体可以参考Gavinzheng的提交
考虑魔改dijkstra
首先,每次拿权值最小的来松弛肯定没有问题,只是怎么表示路径长度
由于边权很小,我们只需要拿 排名 * 10 + w 当权值就可以了。
这里的“权值”是相对的权值,具体可以看代码。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
//#define int long long
#define MAXN 100016
#define pb push_back
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define inf 0x3f3f3f3f
#define cmx( a , b ) a = max( a , b )
#define cmn( a , b ) a = min( a , b )
int n , m;
int head[MAXN] , to[MAXN << 1] , wto[MAXN << 1] , nex[MAXN << 1] , ecn;
void ade( int u , int v , int w ) {
to[++ecn] = v , nex[ecn] = head[u] , wto[ecn] = w , head[u] = ecn;
}
int dis[MAXN] , len[MAXN] , pre[MAXN] , done[MAXN];
priority_queue<pii , vector<pii> , greater<pii> > Q;
queue<int> q;
void dijk( int s ) {
memset( dis , 0x3f , sizeof dis );
memset( len , 0x3f , sizeof len );
memset( pre , -1 , sizeof pre );
dis[s] = 0 , len[s] = 1;
q.push( s );
while( !q.empty() ) {
int u = q.front(); q.pop( );
for( int i = head[u] ; ~i ; i = nex[i] ) {
int v = to[i];
Q.push( mp( 0 , u ) );
if( dis[v] && ! wto[i] )
q.push( v ) , dis[v] = 0 , pre[v] = ( i ^ 1 ) , len[v] = len[u] + 1;
}
}
int rnk = 0 , last = -1;
while( !Q.empty() ) {
pii too = Q.top( ); Q.pop( );
int u = too.se;
if( done[u] ) continue;
done[u] = true;
if( last != dis[u] ) last = dis[u] , ++ rnk;
for( int i = head[u] ; ~i ; i = nex[i] ) {
int v = to[i];
if( dis[v] > rnk * 10 + wto[i] ) {
dis[v] = rnk * 10 + wto[i];
pre[v] = ( i ^ 1 );
len[v] = len[u] + 1;
Q.push( mp( dis[v] , v ) );
} else if( dis[v] == rnk * 10 + wto[i] && len[v] > len[u] + 1 ) {
pre[v] = ( i ^ 1 );
len[v] = len[u] + 1;
Q.push( mp( dis[v] , v ) );
}
}
}
}
int main() {
memset( head , -1 , sizeof head ) , ecn = -1;
cin >> n >> m;
for( int i = 1 , u , v , w ; i <= m ; ++ i ) {
scanf("%d%d%d",&u,&v,&w);
++ u , ++ v;
ade( u , v , w ) , ade( v , u , w );
}
dijk( n );
int c = 1;
stack<int> sss;
while( c != n )
sss.push( wto[pre[c]] ) , c = to[pre[c]];
while( !sss.empty() && sss.top() == 0 ) sss.pop();
if( sss.empty() ) printf("0");
else while( !sss.empty() ) printf("%d",sss.top()) , sss.pop();
puts("");
printf("%d\n" , len[1]);
c = 1;
printf("%d ",0);
while( c != n )
c = to[pre[c]] , printf("%d ",c - 1);
}
Run For Beer CF575G的更多相关文章
- Bubble Cup 8 finals G. Run for beer (575G)
题意: 给定一个带权无向图,每条边的代价为边权/当前速度,每次到达一个新节点,速度都会除以10. 求0号点到n-1号点的最小代价,如果多解输出点数最少的解,输出代价.路径点数.路径经过的点. 1< ...
- Solution -「CF 575G」Run for beer
\(\mathcal{Description}\) Link. 给定 \(n\) 个点 \(m\) 条边的无向图,边有边权,一个人初始速度为 \(1\),每走一条边速度 \(\div10\), ...
- can't run roscore 并且 sudo 指令返回 unable to resolve host
I'm using ubuntu14 LTS. Problems: 1. When run roscore, got a mistake and an advice to ping the local ...
- DotNet Run 命令介绍
前言 本篇主要介绍 asp.net core 中,使用 dotnet tools 运行 dotnet run 之后的系统执行过程. 如果你觉得对你有帮助的话,不妨点个[推荐]. 目录 dotnet r ...
- 布里斯班Twilight Bay Run半程马拉松
自从8月3日跑了半马以后,又一鼓作气报了11月份的西昌马拉松.与第一次马拉松的只求完赛目标不同,第二次当然想取得一个更好的成绩.所以8月份练的比较猛,基本上是练2.3天休息一天,周么还要拉个长于21公 ...
- SVN:Previous operation has not finished; run 'cleanup' if it was interrupted
异常处理汇总-开发工具 http://www.cnblogs.com/dunitian/p/4522988.html cleanup failed to process the following ...
- linux 环境下运行STS时 出现must be available in order to run STS
linux 环境下运行ECLIPSE时 出现 “ A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be avai ...
- 0040 Java学习笔记-多线程-线程run()方法中的异常
run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...
- jBPM4.4 no jBPM DB schema: no JBPM4_EXECUTION table. Run the create.jbpm.schema target first in the install tool.
jBPM4.4 no jBPM DB schema: no JBPM4_EXECUTION table. Run the create.jbpm.schema target first in the ...
随机推荐
- 使用寄存器点亮LED——2
1. 项目:使用stm32寄存器点亮LED, 分别点亮红.绿.蓝3个灯. 2. 步骤 先新建个文件夹保存项目 再新建项目 将startup_stm32f10x_hd.s拷贝到该文件夹下 新建main. ...
- 学习笔记-React的简单介绍&工作原理
一.React简单介绍 1.React起源于Facebook内部项目,与2013年5月 2.是一个用于构建用户界面的JavaScript库 二.React特点 1.声明式设计-React采用声明范式, ...
- 5.29日 Scrum Metting
日期:2021年5月29日 会议主要内容概述:人员调整,xyl同时兼顾前后端:确定表格缩放策略和新图表添加:强调任务分配,总结工作. 一.进度情况## 组员 负责 两日内已完成的工作 后两日计划完成的 ...
- 【做题记录】max-min+1=len 区间计数
(来源:XJ高质量原创题) 原题地址 弱化版:CF526F Pudding Monsters 弱化版 题意:\(n\times n\) 的棋盘上有 \(n\) 颗棋子,每行每列都有且仅有一颗棋子,求出 ...
- Flink 实践教程:入门(1):零基础用户实现简单 Flink 任务
作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接.亚 ...
- 进程间通信消息队列msgsnd执行:Invlid argument——万恶的经验主义
最近在搞进程间通信,首先在我的ubuntu 14.04上写了接口和测试demo,编译和执行都OK,,代码如下: 接口文件ipcmsg.h /* ipcmsg.h */ #ifndef H_MSGIPC ...
- 有向路径检查 牛客网 程序员面试金典 C++ Python
有向路径检查 牛客网 程序员面试金典 C++ Python 题目描述 对于一个有向图,请实现一个算法,找出两点之间是否存在一条路径. 给定图中的两个结点的指针DirectedGraphNode* a, ...
- hdu 3047 Zjnu Stadium(并查集)
题意: 300个座位构成一个圈. 有N个人要入座. 共有M个说明 :A B X ,代表B坐在A顺时针方向第X个座位上.如果这个说明和之前的起冲突,则它是无效的. 问总共有多少个无效的. 思路: 并查集 ...
- hdu 5175 Misaki's Kiss again(GCD和异或)
题意: 给一个数N. 如果GCD(N,M) = N XOR M,则称M是一个kiss 1<=M<=N 问总共有多少个kiss.并且列出所有的值. 思路: 思路一:枚举M.有大量的GCD ...
- hdu 1506 Largest Rectangle in a Histogram(DP)
题意: 有一个柱状图,有N条柱子.每一条柱子宽度都为1,长度为h1...hN. 在这N条柱子所构成的区域中找到一个最大面积,每平方米3块钱,问最多赚多少钱. 输入: 1<=N<=10000 ...