首页 > 其他分享 >CF-938-D-最短路

CF-938-D-最短路

时间:2024-05-10 15:11:06浏览次数:12  
标签:dist int 短路 源点 CF 938 vector push

938-D 题目大意

给定一张\(n\)个顶点\(m\)条边的无向图,边带权,且每个点\(i\)有点权\(a[i]\),记\(dist(i,j)\)为点\(i\)到点\(j\)所有的路径中经过的最小的边权和,请求出对于每个点\(i\)的:

\[\min_j^n(dist(i,j)+a[j]) \]


Solution

题目涉及最短路,启发我们使用\(dijkstra\)求解,但对每个点求一遍最短路复杂度过高。

观察式子,除去求最短路的\(dist\)外,还需要附带一个点权\(a[j]\)。一个经典的做法是化点权为边权,我们建立一个虚拟源点,把所有节点\(i\)向这个虚拟源点连一条边,边权设为\(a[i]\),然后从这个虚拟源点跑一遍\(dijkstra\)即可求出所有答案。

时间复杂度:\(O(mlogm)\)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n,m;
	cin>>n>>m;
	vector<vector<pair<int,ll>>> e(n+1);
	for(int i=0;i<m;i++){
		int x,y;
		ll w;
		cin>>x>>y>>w;
		e[x].push_back({y,2LL*w});
		e[y].push_back({x,2LL*w});
	}
	for(int i=1;i<=n;i++){
		ll w;
		cin>>w;
		e[0].push_back({i,w});
	}
	vector<ll> dist(n+1,1e18);
	vector<int> vis(n+1);
	priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<>> q;
	q.push({0,0});
	dist[0]=0;
	while(!q.empty()){
		auto [d,x]=q.top();
		q.pop();
		if(vis[x]) continue;
		vis[x]=1;
		for(auto [y,w]:e[x]){
			if(d+w<dist[y]){
				dist[y]=d+w;
				q.push({dist[y],y});
			}
		}
	}
	for(int i=1;i<=n;i++){
		cout<<dist[i]<<" ";
	}
	return 0;
}

标签:dist,int,短路,源点,CF,938,vector,push
From: https://www.cnblogs.com/fengxue-K/p/18184401

相关文章

  • CF1773E Easy Assembly
    链接:https://codeforces.com/problemset/problem/1773/E思路首先先得出最终序列,因为它具有唯一性,然后再根据其中的前后关系来判断原来的数列需要切几刀。然后再根据切几刀形成的最终数列判断需要合并几次。例如:目标数列是ABCDEF,而给出的某两段序列是ADBC,EF,那么必要的解法一定......
  • CF1787H Codeforces Scoreboard
    CF1787HCodeforcesScoreboard校内测试的一道题,考试时根本没动。。题面考虑\(k\)比较大的放前面肯定优,然后修门挨着放也肯定优,所以先按\(k\)排个序,然后我们就只考虑每个门修不修。设计状态\(f[i][j]\)表示前\(i\)个点,有\(j\)个门取\(b-kt\),少送回去的最少......
  • CF 191 D
    一条边最多在一个简单环当中,我们发现有几种情况:这个显然直接选一个环覆盖再加上一条\(1\leftrightarrow4\)的边。如果\(4\)没有,那么也是直接选一个环覆盖。如果是有两个及以上的”突出“的边,那么我们显然不用选环,而是把换拆成一些链,这样更优。这个图中就是拆成\(4\leftr......
  • CF516E 做题记录
    link纪念一下独立切的*3100的数论+贪心题,思考时的思路一波三折,像极了考试中的我。个人感觉难度至少*3300。考虑先求出\(d=\gcd(n,m)\),那么编号根据模\(d\)结果分成了\(0...d-1\)共\(d\)个部分,每个部分里的人不能和外面的人玩。因此当\(d>b+g\)时一定无解,......
  • 易基因:cfDNA甲基化组多模式分析早期检测食管鳞状细胞癌和癌前病变|Nature子刊
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。食管癌(EC)是最常见的胃肠道恶性肿瘤之一,食管鳞状细胞癌(ESCC)是EC的主要组织学亚型,约占新EC病例的88%,大多数发生在东亚和中亚。与晚期ESCC的预后极差相比,早期ESCC(如黏膜内ESCC)和前体病变(如上皮内瘤变,IEN)可以通过内镜下整......
  • CF55D Beautiful numbers
    题目链接:https://www.luogu.com.cn/problem/CF55D数位dp解法:所有非零位都能整除这个数,那么就是说这些非零位的公倍数能够整除这个数。那么按照通常情况我们定义dp数组的时候应该定义成dp[pos][num][gbs],表示当前枚举到了第几位、上次枚举到的数、之前所有数位的最小公倍数。那......
  • [题解]CF1907G Lights
    CF1907GLights我们可以把灯抽象成节点,而开关抽象成无向边(重边算作\(1\)条)。显然每个连通块要么是一棵树,要么是一棵基环树。对于基环树,我们把它看做若干棵树处理,最后我们再考虑如何处理环。如下图,这是一棵树,黄色的点表示亮灯。我们选定任意一条边,可以改变子节点和父节点的状......
  • cf433c-ti-jie
    CF433C思路出于习惯,调换$n$和$m$,$n$为数组长度,$m$为值域。考虑枚举被替换的$a_i$。枚举值域$1$到$m$的权值$x$。每个权值为$x$的点$a_i$的贡献是$\mida_i-a_{i-1}\mid+\mida_i-a_{i+1}\mid$。由于$a_i$被更改,贡献会随之变化,与之有关的是所有$a_i$的左......
  • cf396c-ti-jie
    CF396C思路对于一个点维护$b_i=a_i-a_{fa_i}$。对于操作一,等价于$b_u$加$x$,$u$的子树不含$u$的每个点和父亲的差都减$k$。对于操作二,等价于从根到$u$路径上的$b_x$的和。同P3178,子树加,路径查,树剖加线段树。codeintn,q;inthead[maxn],tot;structnd{ intnxt......
  • CF1967C题解
    CF1906D这里更容易进入且有翻译题意对于数组\(a\),有函数\(f(a)\),设数组\(s=f(a)\),则对于每一个\(s_i\),都有:\[s_i=\left(\sum^{i}_{j=(i\operatorname{\&}(i-1))+1}{a_j}\right)\]其中\(\&\)表示按位与运算。对于一个正整数\(k\),函数\(f^k(a)\)定义如......