题目描述:

一个国家有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 遥远的旅途的更多相关文章

  1. 【51Nod】-1326 遥远的旅途

    Description 一个国家有 N 个城市, 这些城市被标为 0,1,2,...N-1. 这些城市间连有 M 条道路, 每条 道路连接两个不同的城市, 且道路都是双向的. 一个小鹿喜欢在城市间沿着 ...

  2. 51nod 1326 奇妙的spfa+dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1326 1326 遥远的旅途 题目来源: TopCoder 基准时间限制: ...

  3. 51nod1326 遥远的旅途(spfa+dp)

    题意: 给出一个无向图,问从1到n是否存在一条长度为L的路径. n,m<=50,1<=路径长度<=10000,L<=10^18 思路: 改变一下思路,我们发现,假设从起点1走到 ...

  4. ACM-图论-同余最短路

    https://www.cnblogs.com/31415926535x/p/11692422.html 一种没见过的处理模型,,记录一下,,主要是用来处理一个多元一次方程的解的数量的问题,,数据量小 ...

  5. 51nod 1273 旅行计划——思维题

    某个国家有N个城市,编号0 至 N-1,他们之间用N - 1条道路连接,道路是双向行驶的,沿着道路你可以到达任何一个城市.你有一个旅行计划,这个计划是从编号K的城市出发,每天到达一个你没有去过的城市, ...

  6. [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)

    [51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...

  7. 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运行环境 ...

  8. HDOJ 1326. Box of Bricks 纯水题

    Box of Bricks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  9. 【51Nod 1244】莫比乌斯函数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...

随机推荐

  1. 实现mypwd

    1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 提交过程博客的链接 代码如图

  2. NumPy简介

    NumPy是什么? NumPy(Numerrical Python 的缩写)是一个开源的Python科学计算库.使用NumPy,就可以很自然的使用数组.NumPy包含很多实用的数学函数,涵盖线性代数运 ...

  3. HTML5文件操作API

    HTML5文件操作API       一.文件操作API 在之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台.或 ...

  4. PM2使用心得

    PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控.自动重启.负载均衡等,而且使用非常简单. 安装 npm install -g pm2 常用命令 $ npm i ...

  5. JQ 标签相关知识

    1.判断 checkbox 和 radio 是否选中 if($("标签选择器").is(":checked")) 2.改变 checkbox 选中状态 .pro ...

  6. JavaScript 原型中的哲学思想

    学习JavaScript过程中,原型问题一直让我疑惑许久,那时候捧着那本著名的红皮书,看到有关原型的讲解时,总是心存疑虑.当在JavaScript世界中走过不少旅程之后,再次萌发起研究这部分知识的欲望 ...

  7. hadoop2.6.0实践:003 检查hadoop是否可用

    start-dfs.sh start-yarn.sh 1.检查hdfs hdfs dfs -ls / http://localhost:50070 2.运行例子程序 hdfs dfs -ls / hd ...

  8. 新概念英语(1-125)Tea for two

    Does Susan have tea by herself?A:Can't you come in and have tea now,Peter? Not yet.B:I must water th ...

  9. django中图片的上传和显示

    上传图片实际上是 把图片存在服务器的硬盘中,将图片存储的路径存在数据库中. 1 首先要配置文件上传的路径: 1.1 建立静态文件目录 在项目根目录下 新建一个 static文件夹,下面再建立一个med ...

  10. 【第十九篇】laydate设置起始时间,laydate设置开始时间和结束时间

    laydate设置开始时间后,结束时间不可小于已选择的开始时间 laydate设置结束时间后,开始时间不可小于已选择的结束时间 //设置开始时间 var startDate = laydate.ren ...