首页 > 其他分享 >旅行 题解

旅行 题解

时间:2024-05-15 15:51:44浏览次数:21  
标签:旅行 use temp int 题解 t2 read 权值

题目链接

题意简述

给定一张有向图,求从点 \(A\) 走到点 \(B\) 的一条路径,这条路径满足:

  1. 经过的边的权值总和是 \(P\) 的倍数。
  2. 在满足条件 \(1\) 的情况下,经过的边的权值总和最小。

题目分析

本题可以使用分层图最短路来解决。

仿照动态规划的思想,定义 \(f_{x,y}\) 表示从节点 \(A\) 到达节点 \(x\),经过的边的权值总和 \(\bmod P\) 的值为 \(y\) 时,经过的边的权值总和最小是多少。

然后进行一遍 Dijkstra 算法,设当前考虑的节点为 \(a\),当前经过的边的权值总和 \(\bmod P\) 的值为 \(b\),扫描到一条通向点 \(c\),权值为 \(d\) 的边,在满足“当前位于点 \(c\),经过的边的权值总和 \(\bmod P\) 的值为 \((b+d) \bmod P\)”这个状态没有被访问过的前提下,如果满足 \(f_{c,(b+d) \bmod P} > f_{a,b}+d\),则使用 \(f_{a,b}+d\) 更新 \(f_{c,(b+d) \bmod P}\)。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){register int t1=0,t2=0;register char x=getchar();while(x<'0' ||x>'9'){if(x=='-') t2|=1;x=getchar();}while(x>='0' && x<='9'){t1=(t1<<1)+(t1<<3)+(x^48),x=getchar();}return t2?-t1:t1;}
inline void write(int x){register int sta[35],top=0;if(x<0) putchar('-'),x=-x;do{sta[top++]=x%10,x/=10;}while(x);while(top) putchar(sta[--top]+48);}
int n,m,p,s,t,f[50005][55],pre_now[50005][55],pre_use[50005][55];
bool vis[50005][55];
struct edge{
	int to,l;
};
vector<edge> v[50005];
struct node{
	int now,sum,use;
};
priority_queue<node> q;
bool operator <(const node &a,const node &b){
	return a.sum>b.sum;
}
vector<int> ans;
void get(int x,int y){//通过保存的路径信息得到具体地路径 
	if(!x) return;
	ans.push_back(x);
	get(pre_now[x][y],pre_use[x][y]);
}
signed main(){
	n=read();
	m=read();
	p=read();
	s=read();
	t=read();
	for(int i=1;i<=m;i++){
		int t1=read(),t2=read(),t3=read();
		v[t1].push_back({t2,t3});
	}
	memset(f,0x3f,sizeof(f));
	f[s][0]=0;
	q.push({s,0,0});
	while(!q.empty()){
		node temp=q.top();
		q.pop();
		if(vis[temp.now][temp.use]) continue;
		vis[temp.now][temp.use]=1;
		for(int i=0;i<v[temp.now].size();i++){
			int t1=v[temp.now][i].to,t2=v[temp.now][i].l;
			if(!vis[t1][(temp.use+t2)%p] && f[t1][(temp.use+t2)%p]>f[temp.now][temp.use]+t2){
				f[t1][(temp.use+t2)%p]=f[temp.now][temp.use]+t2;
				pre_now[t1][(temp.use+t2)%p]=temp.now;//保存路径信息 
				pre_use[t1][(temp.use+t2)%p]=temp.use;//同上 
				q.push({t1,f[t1][(temp.use+t2)%p],(temp.use+t2)%p});
			}
		}
	}
	if(f[t][0]==4557430888798830399) puts("jjc fails in travelling");//考虑无法完成的情况
	else{
		write(f[t][0]);
		putchar('\n');
		get(t,0);
		for(int i=ans.size()-1;i>0;i--){
			write(ans[i]);
			putchar('-');
			putchar('>');
		}
		write(ans[0]);
	}
	return 0;
}

标签:旅行,use,temp,int,题解,t2,read,权值
From: https://www.cnblogs.com/ZnHF/p/18194043

相关文章

  • echarts图由于容器隐藏导致图表不显示问题解决办法
    开发过程中常常会遇到echarts图由于容器隐藏导致图表不显示问题,最简单的办法就是给容器元素加上宽度和高度容器加上固定的宽度和高度<divid="res"style="height:450px;width:1200px"></div>然而在实际开发中某些场景下,要求图表宽度100%显示,而计算容器的宽度有时又会十分的麻......
  • CF1965D Missing Subarray Sum题解
    题目链接点击打开链接题目解法感觉一点都不好想\fn因为最后的序列\(a\)是回文的,所以只有以中心点对称的子段和出现次数为奇数,其他都为偶数考虑有没有什么知道所有子段和的做法,可以方便推出缺失一个的答案令\(g_{l,r}\)为\(l\)到\(r\)的子段和知道\(g_{1,n}\)删......
  • P9175 [COCI2022-2023#4] Mreža 题解
    P9175[COCI2022-2023#4]Mreža题解前言我发现,有整体二分与主席树的地方总有莫队(不是那个莫队,是那个莫队)。知识点(树上)倍增,(树上)莫队,树状数组(“树”含量满满),分块。题意分析给定一棵树,每条边有一个权值\(v\),以及可以用一个花费\(c\)将它变成更大的权值\(s\)。再给定一......
  • Little Pony and Lord Tirek 题解
    LittlePonyandLordTirek题解\(\texttt{ProblemLink}\)题目大意给定长度为\(n\)的序列,第\(i\)个数有三个值:\(s_i,m_i,r_i\),每秒对于每个数执行\(s_i\leftarrow\min\{s_i+r_i,m_i\}\)。有\(m\)个查询,每次查询三个值:\(t,l,r\)查询时刻\(t\),\([l,......
  • [H&NCTF] maybe_xor题解
    maybe_xor感觉这道逆向题与其说是考逆向水平,倒不如说是考编写脚本的能力首先题目给了个远程地址,nc连接会回显ELF:接一串base64编码的东东,解码后发现是ELF文件。用IDA打开发现是从数据段读取24个字节到栈上并进行异或,每个字节异或的值都不同,但异或后的结果不会写回栈程序的目......
  • [题解] Flipping Game
    题目描述有n盏灯,每个灯有开和关两种状态。每按一次灯会变成相反的状态。给定灯初始的开关状态和结束的开关状态,若操作k轮,每轮要按m个不同的灯,问有多少种方法使灯由初始状态变到结束状态。题解需注意每轮要按不同的灯,若无这个条件,暴力计算组合数即可。要操作多轮,且每轮按灯的......
  • 题解:SP10232 AMR11E - Distinct Primes
    前话这咋人名都和HP一模一样了,SPOJ出题人里是不是全是哈迷啊。思路非常直观的一个思路:从前往后枚举每一个数,看是否满足条件,输出满足条件的第一个。CODE#include<bits/stdc++.h>usingnamespacestd;boolis(intn){//判断质数if(n<2)return0;for(inti=2;i<......
  • 题解:CF1337A Ichihime and Triangle
    看到大佬们基本都是直接输出\(b\)\(c\)\(c\)了事儿,一身反骨有其它构造方法的我表示不服,遂作此篇。众所周知,两边之和大于第三边,所以,如果\(b+c>d\),那么\(b\)、\(c\)、\(d\)就是正确的。那如果不满足呢?在题目条件下\(b+c>b+c-1\),那么这一组就是合理的。分别验......
  • NOIP真题题解
    2001T4Car的旅行路线ybtluogu建图+最短路1.建图时细节较多已知三点求第四点的坐标勾股定理判断斜边2.最短路时多起点多终点2013D1T3货车运输ybtluogu最大生成树+倍增LCA答案的边一定在最大生成树上将原图建出最大生成树在树上使用倍增LCA提取路径2014D2T2寻......
  • 5.13 模拟赛题解(没写完)
    T1P4304[TJOI2013]攻击装置快进到HZOI2023超越HZOI2020(人均场切了紫)考虑将棋盘黑白染色成这个样子容易发现相同颜色的点直接一定没有冲突,满足二分图的性质,需要求出最小点覆盖,所以直接按冲突建好双向边,从\(1\)到\(n^2\)节点跑最大匹配即可。设求出的最大匹配为\(......