题意:
给出一个无向图,问从1到n是否存在一条长度为L的路径。
n,m<=50,1<=路径长度<=10000,L<=10^18

思路:
改变一下思路,我们发现,假设从起点1走到终点N有一条路径的长度为a,假设它再往一条与终点相连的长为b的路径反复走无数次后使得路径长度到达了T,那么一定有(T-a)%(2*k)==0**T%(2*k)=a%(2*k),所以我们只需要看是否从1到N存在一条路径长度为d,使得d%(2*k)=t%(2*k)
因为这个题目和模数有关,所以我们要把取摸的结果写入状态.
dp[i][j]表示处于i节点,从一号点到i号点的花费和%(2*k)(选择的边权)等与k的最小花费.
那么转移就是: dp[to][(j+quan)%mod]=min(dp[now][j]+quan)
因为具有后效性,所以需要spfa.

//这道题较多的参考了晚上的解法,在看懂之后自己又写了一遍
//链接:https://blog.csdn.net/qq_33229466/article/details/77131289
#include<cstdio>
#include<queue>
#include<string.h>
using namespace std;
typedef long long LL;const int maxn = 50 + 5, maxm = 2e4 + 5;
int n, m, num, head[maxn];
LL t, dp[maxn][maxm], inf = 2000000000000000000;
bool vis[maxn][maxm];struct node { int to, w, next;
}edge[maxn * 2];
queue<pair<int, int>>q;void add_edge(int u, int v, int w)
{edge[++num].to = v; edge[num].w = w; edge[num].next = head[u]; head[u] = num;
}void spfa(int mod)
{q.push(make_pair(1,0)); vis[1][0] = 1;while (!q.empty()){pair<int,int> u = q.front(); q.pop();int x = u.first, y = u.second;for (int i = head[x]; i; i = edge[i].next)if (dp[x][y] + edge[i].w < dp[edge[i].to][(y + edge[i].w) % mod]){int nx = edge[i].to, ny = (y + edge[i].w) % mod;dp[nx][ny] = dp[x][y] + edge[i].w;if (!vis[nx][ny]) {q.push(make_pair(nx, ny));vis[nx][ny] = 1;}}vis[x][y] = 0;}
}int main()
{int kase;scanf("%d", &kase);while (kase--){memset(head, 0, sizeof(head));scanf("%d%d%lld", &n, &m, &t);num = 0;for (int i = 1; i <= m; i++){int x, y, w;scanf("%d%d%d", &x, &y, &w);add_edge(x, y, w);add_edge(y, x, w);}int flag = 0;for (int i = 1; i <= num; i += 2)if (edge[i].to == 1 || edge[i + 1].to == 1){int w = edge[i].w * 2;for (int j = 1; j <= n; j++) {for (int k = 0; k < w; k++) {dp[j][k] = inf;}}dp[1][0] = 0;spfa(w);if (dp[n][t%w] <= t){printf("Yes\n");flag = 1;break;}}if (!flag) printf("No\n");}return 0;
}

51nod1326 遥远的旅途(spfa+dp)相关推荐

  1. [51nod1326]遥远的旅途

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

  2. 【51nod1326】遥远的旅途

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

  3. BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)

    Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MB Submit ...

  4. [Bzoj1003][ZJOI2006]物流运输(spfa+dp)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1003 比较简单的dp,dp[i]为1-i天最小费用,dp方程为dp[i] = min(d ...

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

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

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

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

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

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

  8. BZOJ 1003 [SPFA][DP]

    1003: [ZJOI2006]物流运输 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转 停好几个码头.物流公司通常会设计一 ...

  9. bzoj 1003(spfa+dp)

    1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5725  Solved: 2353 [Submit][St ...

最新文章

  1. Json 动态获取key 或者获取value
  2. 优先级队列实现哈夫曼树的编码和译码
  3. 【统计学习方法】感知机对鸢尾花(iris)数据集进行二分类
  4. C++中虚函数与多态实现
  5. 转发:php解决高并发
  6. C++中的inline用法
  7. python操作sqlite3 导入csv文件_[转载]SQLite 3导入导出成txt或csv操作
  8. 【hihocoder - offer编程练习赛60 A】hohahola(贪心,二分)
  9. 单调栈和单调队列的应用即总结
  10. OSPF特殊区域和选路规则
  11. 在《Windows程序设计》中出现过的消息
  12. window的bat批处理命令
  13. cad怎样弄出放线的坐标_利用CAD绘制全站仪放线用的坐标点
  14. 开始使用Mac OS X——致Mac新人
  15. 谈谈如何提升工作效率,需要从这4方面入手!
  16. 关于年薪百万,聊聊年薪380万的研发人是什么样子的
  17. aspack的简单脱壳,望大牛勿喷。
  18. python:实现丢番图方程算法(附完整源码)
  19. Vue.js使用Blob的方式实现excel表格的下载(流文件下载)
  20. VS 2013 产品密钥

热门文章

  1. 郭德纲新宠香奈儿 大牌造型盘点
  2. Java SE 6 新特性: 对脚本语言的支持 [VERY GOOD]
  3. Windows循环渐进-Ping程序实现代码
  4. LeetCode 110 Balanced Binary Tree
  5. [kaggle]华盛顿单车数据预测
  6. 学计算机没有电脑怎么办,电脑没有excel怎么办
  7. NCBI中各个符号代表意思
  8. V-REP笔记:重力加速度的修改
  9. 从T型人才理解ALM Polarion
  10. 告别20k/s,利用IDM直链下载网盘资源(油猴)