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=0; int r=0; char c=getchar();while(c<'0' || c>'9') { if(c=='-') b=!b; c=getchar(); }while(c>='0' && c<='9') { r=r*10+c-'0'; c=getchar(); }if(b) return -r; return r;
}const int inf = 1e9+7, N = 65, M = 2e5+7;
int n,m,t,s,num,f[N],dp[N][M];
bool b[N][M],fg=0;
struct node
{int nx,to,ds;
}da[N<<1];
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=1;i<=n;i++) for(int j=0;j<s;j++) dp[i][j]=t+1, b[i][j]=0;    // 切记从 1 开始b[1][0]=1; dp[1][0]=0; date st={1,0}; q.push(st);while(!q.empty()){date o=q.front(); q.pop(); int x=o.x, y=o.y; b[x][y]=0;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]=1; }}}}
}main()
{int C=gi();while(C--){n=gi(), m=gi(), t=gi(), fg=1;for(int i=0;i<m;i++){int x=gi()+1, y=gi()+1, z=gi();link(x,y,z), link(y,x,z);}for(int i=f[n];i;i=da[i].nx){s=da[i].ds<<1; spfa();if(dp[n][t%s]<=t) { puts("Possible"); fg=0; break; }}if(fg) puts("Impossible");for(int i=1;i<=n;i++) f[i]=0; num=0;}return 0;
}

转载于:https://www.cnblogs.com/y142857/p/6833044.html

【51Nod】-1326 遥远的旅途相关推荐

  1. 51nod 1326 遥远的旅途

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

  2. 51nod 1326 遥远的旅途 最短路建模

    题意 给出一个无向图,问从1到n是否存在一条长度为L的路径. n,m<=50,1<=路径长度<=10000,L<=10^18 分析 考虑枚举起点的每一条出边,设其权值为w,那么 ...

  3. 【51nod 1326】遥远的旅途【最短路】

    题目: 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1326 给出一张nnn个点mmm条边的无向图,询问是否有一条从1到nnn ...

  4. [51Nod 1326]:遥远的旅途

    传送门 这个题的思路就是个dp,不过是在模意义下的dp 我们来设计一个dp[i][j],代表在i这个点,当前路径长度%mod==j,的最小路径长度 我们枚举终点周围的每一条边x,然后mod=2*x,跑 ...

  5. #同余最短路# [51nod] 遥远的旅途

    题目 http://www.51nod.com/Challenge/Problem.html#problemId=1326 解题思路 我们要使到nnn的时间恰好为ttt,那么必然存在一个环,在到达了某 ...

  6. 【51 Nod 1326】遥远的旅途

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

  7. 【51nod1326】遥远的旅途

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

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

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

  9. [51nod1326]遥远的旅途

    Description 一张有n个点,m条变的无向图,每条边有边权. 在0时刻有一个人在点1,每一次他走过一条边,消耗的时间为这条边的边权,而不能停留在原地. 现在他想知道是否存在一种方案使得他在T时 ...

最新文章

  1. Python游戏开发pygame模块,Python实现球球碰撞小游戏
  2. 用adb命令启动停止Android程序
  3. 配置 influxDB 鉴权及 HTTP API 写数据的方法
  4. java中怎样创建多个对象,java中StringBuilder.appent方法创建几个对象
  5. CentOS 7.4 基于LNMP搭建wordpress
  6. CMD批量创建目录-配置管理
  7. golang panic的错误回收和简单的使用场景
  8. 【蓝桥杯嵌入式】【STM32】7_RTC之实时时间显示和硬件闹钟设置
  9. 心理学Notes:常用心理测量工具的选择
  10. android笔记--与服务器交互更改简历状态
  11. Java基础知识框图总结
  12. Android 配置 junit 单元测试
  13. web前端入坑第二篇:web前端到底怎么学?干货资料!
  14. 秀米html编辑器,ueditor集成秀米编辑器
  15. Z05 - 006、网站转化以及漏斗分析(转化分析)
  16. Laravel 报错 failed to open stream 的解决方法
  17. 游戏设计之动作游戏见解
  18. ZOJ 1598 Spherical Triangle
  19. 互联收集金融,其实是门苦商业
  20. 3.1集合的概念和表示法

热门文章

  1. 极客时间和极客学院_极客奔跑
  2. matlab画根轨迹的渐近线,根轨迹的渐近线.ppt
  3. MySQL 数据表查询
  4. 推荐四个Flutter重磅开源APP项目!
  5. OPC UA JAVA开发笔记(四):数据写入
  6. search engin学习笔记1
  7. 奥巴马演讲:我们需要的变革
  8. 关于uni-app获取完整的iccid(中间带有字母的iccid)
  9. 什么是证书颁发机构(CA)
  10. Java中double类型输出小数点后两位