Description

一个国家有 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。

Input

多组测试数据, 输入的第一行含一个整数 caseT, 表示测试数据个数, 1<=caseT<=5.
之后有 caseT 组相同结构的测试数据, 每组测试数据构成如下:
第一行三个整数, N, M, T,
且 2<=N<=50,1<=M<=50, 1<=T<= 10^18).
之后 M 行, 每行三个整数 Ai,Bi,Di,表示城市 Ai 与 Bi 间有一条双向道路, 且小鹿穿越
这条路要花费 Di 的时间。 其中, 0<= Ai,Bi<N, 1<=Di<=10000。

Output

每组测试数据一行输出, 如果存在题目所述路径输出“ Possible”, 否则“ Impossible”,
不含引号。

Sample Input

1
3 3 25
0 2 7
0 1 6
1 2 5

Sample Output

Possible

Hint

【数据范围】
对于 10%的数据, caseT=1
对于另外 20% 的数据, caseT=2
对于 100%的数据, caseT<=5

基本思想:能否在T时刻刚好到达n号点,可选n点的任一入边(q-->n),记录边长ds,看能否在S时刻到达q,且   (T-S)%(2*ds)==0(S<=T)。

然后可以设dp[x][y] 表示到达x点,并且使dp[i][j]%(2*ds)==j 成立的最小时刻。初始化dp[1][0]=0;然后跑SPFA;DP方程dp[k][ (j+dis[i][k])%(2*ds) ] = min { dp[i][j] + dis[i][k] }。

几个注意点:

1:要开 long long,而且切记写在 gi() 之前!

2:如果没有跑完SPFA就直接 return ,切记先把队列弹空!

#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
#define file(a) freopen(a".in","r",stdin); freopen(a".out","w",stdout); inline int gi()
{
bool b=; int r=; char c=getchar();
while(c<'' || c>'') { if(c=='-') b=!b; c=getchar(); }
while(c>='' && c<='') { r=r*+c-''; c=getchar(); }
if(b) return -r; return r;
} const int inf = 1e9+, N = , M = 2e5+;
int n,m,t,s,num,f[N],dp[N][M];
bool b[N][M],fg=;
struct node
{
int nx,to,ds;
}da[N<<];
struct date
{
int x,y;
};
queue<date>q; void link(int fr,int to,int ds)
{
da[++num].to=to, da[num].ds=ds, da[num].nx=f[fr], f[fr]=num;
} void spfa()
{
for(int i=;i<=n;i++) for(int j=;j<s;j++) dp[i][j]=t+, b[i][j]=;  
  // 切记从 1 开始
b[][]=; dp[][]=; date st={,}; q.push(st);
while(!q.empty())
{
date o=q.front(); q.pop(); int x=o.x, y=o.y; b[x][y]=;
for(int i=f[x];i;i=da[i].nx)
{
int tt=da[i].to, ss=da[i].ds, l=(y+ss)%s; // y 和 dp[x][y] 对于s 同余
if(dp[x][y]+ss<dp[tt][l])
{
dp[tt][l]=dp[x][y]+ss;
if(!b[tt][l]) { date v={tt,l}; q.push(v); b[tt][l]=; }
}
}
}
} main()
{
int C=gi();
while(C--)
{
n=gi(), m=gi(), t=gi(), fg=;
for(int i=;i<m;i++)
{
int x=gi()+, y=gi()+, z=gi();
link(x,y,z), link(y,x,z);
}
for(int i=f[n];i;i=da[i].nx)
{
s=da[i].ds<<; spfa();
if(dp[n][t%s]<=t) { puts("Possible"); fg=; break; }
}
if(fg) puts("Impossible");
for(int i=;i<=n;i++) f[i]=; num=;
}
return ;
}

【51Nod】-1326 遥远的旅途的更多相关文章

  1. 51Nod 1326 遥远的旅途

    题目描述: 一个国家有N个城市,这些城市被标为0,1,2,...N-1.这些城市间连有M条道路,每条道路连接两个不同的城市,且道路都是双向的.一个小鹿喜欢在城市间沿着道路自由的穿梭,初始时小鹿在城市0 ...

  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. CF85D Sum of Medians

    CF85D Sum of Medians 题意翻译 一个集合,初始为空.现有三个操作: 1.add:向集合里加入数x,保证加入前集合中没有数x: 2.del:从集合中删除数x,保证删除前集合中有x: ...

  2. 什么是PHP闭包???

    闭包函数:临时创建一个没有名称的函数,经常作为回调函数来用. 通俗的说就是:子函数可以使用父函数中的局部变量,这种行为叫做闭包. 1.匿名函数赋值 $demo=function($str){ echo ...

  3. MySQL中一致性非锁定读

    一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行 ...

  4. mac开发环境爬坑记(搭建php+nginx+mysql+redis+laravel+git+phpstorm)

    题外话:前几天,终于以原价一半的价格,将我那台15版mbp在bbs上卖了出去.之所以用了“终于”这个词儿,是我一直迟迟没有下定决心卖掉它,可眼瞅着再不卖掉,又要掉价,况且我的新电脑,也终于下来了. 话 ...

  5. yum命令的实例

    1) 自定义yum仓库:createrepo 2) 自定义repo文件 3) 使用yum命令安装httpd软件包(在这里需要强调一点,本身执行yum.repos.d时,文件里面是有自带的yum源的,需 ...

  6. argparse 模块 在终端执行脚本文件

    1.案例 #1.案例: import argparse #首先导入模块 parser = argparse.ArgumentParser() #创建一个解析对象 parser.add_argument ...

  7. 如何删除github中的仓库?

    使用Github管理项目确实有些好处,但删除仓库(repositories)确实不太好找到. 首先进入要删除的仓库,点击右下角的“settings” 然后拉到页面最下面在danger zone 按“d ...

  8. 3.4 使用STC89C52控制MC20解析GPS的经纬度数据在LCD1602上显示

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  9. Python 9 sqlalchemy ORM

    一.ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型 ...

  10. Fidder详解之抓包

    前言 本文是博主发表的第一篇文章,如有傻逼之处,请大家见谅.最近遇到很多人说接口相关的问题,比如:什么是接口,我该怎么做接口测试,还有我总是抓不到APP上的https请求(这个巨坑,不知道坑了多少小白 ...