首页 > 其他分享 >AT_abc325_e [ABC325E] Our clients, please wait a moment 题解

AT_abc325_e [ABC325E] Our clients, please wait a moment 题解

时间:2023-12-20 09:12:45浏览次数:24  
标签:int 题解 clients please long vis include d2 d1

原题传送门

最短路板题。

乘坐的过程一定是先车再火车(如果有),假设换车地点为 \(x\),那么最小代价为坐车从 \(1\) 到 \(x\) 与坐火车从 \(x\) 到 \(n\) 的最小代价之和,分开跑最短路即可,时间复杂度 \(O(n^2\log n+n)\)。

code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define int long long
using namespace std;
const long long linf=9223372036854775807;
const int N=1000+10;
int n,a,b,c,dist[N][N],lst[N],d1[N],d2[N],ans=linf;
bool vis[N];
struct node{int v,w;};
vector<node> g[N];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
void dij(int x)
{
	memset(vis,0,sizeof(vis));
	q.push(make_pair(0,x));
	while(!q.empty())
	{
		int u=q.top().second;
		q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(int v=1;v<=n;v++)
		{
			if(u==v)continue;
			int w=(x==1?dist[u][v]*a:dist[u][v]*b+c);
			if(x==1&&d1[v]>d1[u]+w)
			{
				d1[v]=d1[u]+w;
				q.push(make_pair(d1[v],v));
			}
			if(x==n&&d2[v]>d2[u]+w)
			{
				d2[v]=d2[u]+w;
				q.push(make_pair(d2[v],v));
			}
		}
	}
}
signed main()
{
	scanf("%lld%lld%lld%lld",&n,&a,&b,&c);
	memset(d1,127,sizeof(d1));
	memset(d2,127,sizeof(d2));
	d1[1]=0;
	d2[n]=0;
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%lld",&dist[i][j]);
	dij(1),dij(n);
	for(int i=1;i<=n;i++)ans=min(ans,d1[i]+d2[i]);
	printf("%lld",ans);
}

标签:int,题解,clients,please,long,vis,include,d2,d1
From: https://www.cnblogs.com/jr-inf/p/17915348.html

相关文章

  • AT_abc323_f [ABC323F] Push and Carry 题解
    不难发现答案的下界为\(|x_b-x_c|+|y_b-y_c|\),这是每步都推箱子的情况。但很多时候并不能直接开始推箱子,所以人要先移动到箱子的后面(相对于目的地),再把箱子往目的地推。比如这种情况(B为箱子,C为目的地):B.......C推完箱子的一边后,还要走到另一边:↓B..................
  • USACO2023 Cu,Ag,Au 题解
    晚上没事干,于是写了。Cu:1h25minAg:2h40minAu:2h15min做最久的竟然是AgT1。CuT1诈骗题,做了50min。考虑如果越过了\(a_i\)往后走,那么\(a_i\)的高度至少翻了一倍。直接模拟即可。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;const......
  • CF1913 E Matrix Problem 题解
    LinkCF1913EMatrixProblemQuestion给定一个\(n\timesm\)的01矩阵,你可以把矩阵中的任意一个元素01翻转需要最后的矩阵满足,每行\(1\)的个数有\(A[i]\)个,每列\(1\)的个数有\(B[i]\)个Solution这貌似是一道非常经典的费用流题目我们建立\(n\)个行节点,\(m......
  • 2023强网杯ez_fmt题解及进阶格式化之劫持子函数
    格式化任意内存读写相信已经是老生常谈了,但是随着题目难度加大,格式化题目给我们的难题逐渐变成了覆写什么,改写什么。这题对我是一道很好的例题,其中对栈及函数调用的理解堪称刷新我的认知。exp先放着,想自己调试理解的可以看看。frompwnimport*context(terminal=['tmux','......
  • CSP2023-12树上搜索题解
    刚考完csp,这道题是大模拟题,题意不难理解。以下是题目链接:http://118.190.20.162/view.page?gpid=T178当时考场上这道题调了好久没调出来,忽略了很多细节。在这里分享一下满分题解及思路,帮大家避避坑。#include<iostream>#include<stdio.h>#include<queue>#include<cstring>#inc......
  • syoj.1827. 线段传送带题解
    前情提要-三分1827.线段传送带P2571[SCOI2010]传送带省流:三分套三分。在二维平面上有两个传送带,一个从A点到B点,一个从C点到D点,速度分别是p和q,在平面内其他点的速度为r。求A点到D点的最小速度。考虑从A到D的路程一定是\(AE+EF+FD\),即通过这两个点连......
  • CF1733D1 题解
    原题传送门题目大意给定两个长度为\(n\)的二进制字符串\(a\)和\(b\),你可以进行若干次操作,对于每次操作:选两个数\(l\)和\(r\),且\(l<r\),将\(a_l\)和\(a_r\)交换。如果选取的\(l\)和\(r\)相邻,代价为\(x\),否则为\(y\)。保证\(y≤x\),求出最小代价使得\(a=......
  • CF1191B 题解
    原题传送门题目大意\(3\)块麻将,求需要换掉几张牌才能一次出完\(3\)块麻将。每块麻将,用一个长度为\(2\)的字符串给出,字符串由\((1,9)\)的一位数字和\(m\)、\(s\)或\(p\)组成。\(3\)块一模一样的麻将或第\(2\)位相同,前面是连号的\(3\)块麻将都可以一次性出完。......
  • CF175B 题解
    原题传送门题目大意如题目描述。思路分析\(1≤n≤1000\),很明显\(\mathcal{O(n^2)}\)不超时,使用结构体,暴力即可。利用双循环求出名字相同的结构体并判断最高分,再根据字典序排序,再双循环求出比自己优秀人数,输出即可。代码:/*Writtenbysmx*/#include<bits/stdc++.h>usin......
  • Atcoder ABC 333 题解(A - F)
    ABC不讲D待更E待更F设$f(i,j)$为有$i$个人时,第$j$个人活到最后的概率,显然:\[f(i,j)=\begin{cases}1,&i=1,j=1\\\frac{1}{2}f(i,i),&i\neq1,j=1\\\frac{1}{2}f(i,j-1)+\frac{1}{2}f(i-1,j-1),&i\neq1,2\lej......