51Nod 1326 遥远的旅途
题目描述:
一个国家有N个城市,这些城市被标为0,1,2,...N-1。这些城市间连有M条道路,每条道路连接两个不同的城市,且道路都是双向的。一个小鹿喜欢在城市间沿着道路自由的穿梭,初始时小鹿在城市0处,它最终的目的地是城市N-1处。小鹿每在一个城市,它会选择一条道路,并沿着这条路一直走到另一个城市,然后再重复上述过程。每条道路会花费小鹿不同的时间走完,在城市中小鹿不花时间逗留。路程中,小鹿可以经过一条路多次也可以经过一个城市多次。给定城市间道路的信息,问小鹿是否有一种走法,从城市0出发到达城市N-1时,恰好一共花费T个单位的时间。如果存在输出“Possible”,否则输出“Impossible”。
注意,小鹿在整个过程中可以多次经过城市N-1,只要最终小鹿停在城市N-1即可。
例如样例中小鹿的行程可以是0->1->2->0->2.
解题报告:
用时:1h30min,1TLE
这题首先要明白,到终点至少要经过一条n的出边,所以如果可行,一定是将某一条出边走很多次,然后再到达终点,即 \(2*w+j==T\),所以只要 \(j=T\mod2*w\) 存在即可,所以我们枚举每一条出边,然后跑spfa ,看 \(f[n][j]\) 是否存在即可,我们定义 \(f[i][j]\) 表示到达了\(i\)这个点 走过的距离\(s \mod2*w\)为\(j\)的最小时间,因为要保证到达n后时间\(\leq T\),所以我们要使得\(f[n][j]\)尽量小,做spfa即可
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
const int N=55,M=1000005;
int q[M][2],mod=M,n,m,head[N],to[N<<1],dis[N<<1],nxt[N<<1],num=0,mo;
ll TT,f[N][20005];bool vis[N][20005];
void link(int x,int y,int z){
nxt[++num]=head[x];to[num]=y;dis[num]=z;head[x]=num;
}
void spfa(){
int x,u,disp,t=0,sum=1,now;q[sum][0]=1;q[1][1]=0;
memset(vis,0,sizeof(vis));vis[1][0]=true;
memset(f,127/3,sizeof(f));f[1][0]=0;
while(t!=sum){
t++;if(t==mod)t=0;x=q[t][0];now=q[t][1];
if(f[n][TT%mo]<=TT)return ;
for(int i=head[x];i;i=nxt[i]){
u=to[i];
disp=(now+dis[i])%mo;
if(f[x][now]+dis[i]<f[u][disp]){
f[u][disp]=f[x][now]+dis[i];
if(!vis[u][disp]){
vis[u][disp]=true;sum++;if(sum==mod)sum=0;
q[sum][0]=u;q[sum][1]=disp;
}
}
vis[x][now]=false;
}
}
}
void Clear(){
memset(head,0,sizeof(head));num=0;
}
void work()
{
Clear();
int x,y,z;
cin>>n>>m>>TT;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
x++;y++;link(x,y,z);link(y,x,z);
}
for(int i=head[n];i;i=nxt[i]){
mo=dis[i]<<1;
spfa();
if(f[n][TT%mo]<=TT){
puts("Possible");
return ;
}
}
puts("Impossible");
}
int main()
{
int T;cin>>T;
while(T--)work();
return 0;
}
51Nod 1326 遥远的旅途的更多相关文章
- 【51Nod】-1326 遥远的旅途
Description 一个国家有 N 个城市, 这些城市被标为 0,1,2,...N-1. 这些城市间连有 M 条道路, 每条 道路连接两个不同的城市, 且道路都是双向的. 一个小鹿喜欢在城市间沿着 ...
- 51nod 1326 奇妙的spfa+dp
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1326 1326 遥远的旅途 题目来源: TopCoder 基准时间限制: ...
- 51nod1326 遥远的旅途(spfa+dp)
题意: 给出一个无向图,问从1到n是否存在一条长度为L的路径. n,m<=50,1<=路径长度<=10000,L<=10^18 思路: 改变一下思路,我们发现,假设从起点1走到 ...
- ACM-图论-同余最短路
https://www.cnblogs.com/31415926535x/p/11692422.html 一种没见过的处理模型,,记录一下,,主要是用来处理一个多元一次方程的解的数量的问题,,数据量小 ...
- 51nod 1273 旅行计划——思维题
某个国家有N个城市,编号0 至 N-1,他们之间用N - 1条道路连接,道路是双向行驶的,沿着道路你可以到达任何一个城市.你有一个旅行计划,这个计划是从编号K的城市出发,每天到达一个你没有去过的城市, ...
- [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)
[51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...
- seL4之hello-2旅途(完成更新)
seL4之hello-2旅途 2016/11/19 13:15:38 If you like my blog, please buy me a cup of coffee. 回顾上周 seL4运行环境 ...
- HDOJ 1326. Box of Bricks 纯水题
Box of Bricks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
随机推荐
- C语言——第二次作业
**学习内容总结** 本周是国庆假期,学习了mooc相关课程.阅读了<提问的智慧>一文. 文章总结 1.在提问之前,要利用身边的资源(例如相关资料.FAQ.浏览器搜索)试着自己寻找答案,或 ...
- Oracle查询用户权限
Oracle查询用户权限 -- 确定角色的权限select * from role_tab_privs ; 包含了授予角色的对象权限select * from role_ro ...
- python array 使用创建10万浮点数
from array import array from random floats = array('d',random((for i in range(10**7)) fp = open('flo ...
- Spring Boot jar包linux服务器部署
Spring Boot 部署 一.使用命令行java -jar 常驻 nohup java -jar spring-boot-1.0-SNAPSHOT.jar > log.file 2>& ...
- Environment.getExternalStorageDirectory()
Environment.getExternalStorageDirectory()得到的是storage/emulated/0
- JAVA_SE基础——46.引用数据类型变量.值交换[独家深入解析]
需求:定义一个函数交换数组中两个元素的位置. code 1: import java.util.*; class Demo3 { public static void main(String[] ar ...
- Java面试题(二)
系统整理了一下有关Java的面试题,包括基础篇,javaweb篇,框架篇,数据库篇,多线程篇,并发篇,算法篇等等,陆续更新中.其他方面如前端后端等等的面试题也在整理中,都会有的. 注:文末有福利! 1 ...
- Win7添加php环境变量.
1) "我的电脑"右键"属性"->高级系统设置->环境变量->系统变量->Path->编辑 2) 将PHP的执行路径的目录&quo ...
- python生成单词壁纸
1.首先上结果: 其实就是一段简单的代码.加上英语单词表加上几张背景图生成许多类似的图片再设置成桌面背景,十分钟一换.有心的人闲的时候随手就能换换桌面背背单词.最不济也能混个脸熟. 3.上代码 #-* ...
- Dojo API中文 Dojo内容模块概览,初学者
官网:http://dojotoolkit.org/reference-guide/1.10/dojo/index.html#dojo-dojo的翻译 dojo 内容: dojo dojo/dojo ...