首页 > 其他分享 >P1001 A+B Problem(整活-dijstra堆优化)

P1001 A+B Problem(整活-dijstra堆优化)

时间:2024-08-15 19:15:53浏览次数:10  
标签:整活 复杂度 long dijstra Dijkstra len Problem dis log

OK 啊,这就是普通的 \(a+b\) 嘛
这是一道十分淼的题目,乍一看,这不就是dijstra堆优化的模板题吗?
首先,建立三个节点,两条线
行,OK 开始 Code

#include <bits/stdc++.h>
using namespace std;
const long long N = 99999, M = 999999;
typedef pair<long long, long long> PII;
priority_queue<PII, vector<PII>, greater<PII> > q;
long long n, p, c, k, x, y, l;
long long pre[N];//链表头
long long d[N];//dis距离数组
bool f[N];//标记数组
struct Node {
	long long v, next, len;//链式前向星
} a[M * 2];
void add(long long u, long long v, long long len) {
	a[++k] = {v, pre[u], len};
	pre[u] = k;
}//建边
int dijkstra(long long h) {
	d[h] = 0;
	q.push({0, h});
	while (!q.empty()) {
		PII b = q.top();
		long long dis = b.first;
		long long pi = b.second;
		q.pop();
		if (f[pi]) continue;
		f[pi] = true;
		for (long long i = pre[pi]; i; i = a[i].next) {
			long long to = a[i].v;
			if (d[to] > dis + a[i].len) {
				d[to] = dis + a[i].len;
				q.push({d[to], to});
			}
		}
	}
	return d[3];
}//dijstra堆优化
int main() {
	//全开longlong防止数据爆掉
	cin >> x >> y; //读入x,y;
	//使用链式前向星进行建图
	add(1, 2, x);
	add(2, 3, y);
	memset(d, 0x3f, sizeof(d));
	memset(f, 0, sizeof(f));
	cout << dijkstra(1); //开始跑dijstra堆优化
	return 0;
}

时间复杂度
总共需要遍历 \(2\) 条边,插入数据修改小根堆的时间复杂度为 \(O(N \log_2(N))\) 所以时间复杂度为 \(O(3*\log_2(3))\)。因为对于 稀疏图 来说边数与点数很接近,所以可以看做为 \(O(N \log_2(N))\)。但是对于 稠密图 来说边数接近点数的平方个,如果稠密图使用堆优化版的 Dijkstra 算法,那么时间复杂度将会是 \(O(n^2*\log_2(n))\),显然不如直接使用朴素 Dijkstra 算法。所以堆优化版的 Dijkstra 算法更适用于稀疏图 ,而朴素 Dijkstra 算法更适用于稠密图。
综上所述:本程序的时间复杂度为 \(O(3*log_2(3))\)
最后祝大家早日成为大牛

标签:整活,复杂度,long,dijstra,Dijkstra,len,Problem,dis,log
From: https://www.cnblogs.com/ACyming/p/18361635

相关文章

  • Android Studio报错: A problem occurred starting process command ,CreateProcess er
    AndroidStudio报错:Aproblemoccurredstartingprocesscommand,CreateProcesserror=2,系统找不到指定的文件一、遇到问题二、解决问题重新下载了22.0.7026061和22.1.7171670只在cmake.dir中修改了路径(ndk.dir中修改了路径[未尝试])clean+SyncProject,OK了!......
  • Ideas of Problems in Aug. 2024
    \(\text{LuoguP1552[APIO2012]派遣}\)前置芝士:可并堆(左偏树)或斜堆或启发式合并。本题题意概括为:给定一颗以\(1\)为根的树,每个点有权值\(L_i\),花费\(C_i\),可以选择一个以某个结点为根的子树,并从其中选出一个点集\(T\)满足\(\sum_{i\inT}C_i\leqM\),那么此次的价......
  • E - Xor Sigma Problem
    原题链接题解首先,位运算很容易想到按位枚举。而这道题的关键是如何快速求区间异或和。对此,我们构建一个后缀异或数组即可,甚至这个数组可以进一步优化为cnt1和cnt0两个变量。(具体实现看code理解)code #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;......
  • 洛谷P1480 A/B Problem
    4.高精度除以低精度题目叙述:A/BProblem题目描述输入两个整数\(a,b\),输出它们的商。输入格式两行,第一行是被除数,第二行是除数。输出格式一行,商的整数部分。样例#1样例输入#1102样例输出#15提示\(0\lea\le10^{5000}\),\(1\leb\le10^9\)。代码本题为高精......
  • leetcode 1486. 数组异或操作 https://leetcode.cn/problems/xor-operation-in-an-arr
    1486.数组异或操作题目描述给你两个整数,n和start。数组nums定义为:nums[i]=start+2*i(下标从0开始)且n==nums.length。请返回nums中所有元素按位异或(XOR)后得到的结果。示例示例1:输入:n=5,start=0输出:8解释:数组nums为[0,2,4,6,8],其中(0^......
  • Monty Hall problem
    Theproblemcanbeformulatedasfollows.Asaparticipantofagame show,youhavetochooseoneofthreedoors.Behindoneofthedoorsisa prize,behindtwootherdoorsisnothing.Afteryoupickadoor,thegame host,whoknowswheretheprizeis,se......
  • ARC181 - B - Annoying String Problem
    B-令人讨厌的字符串问题编辑:evima在大多数情况下,\(f(S,T,X)\)和\(f(S,T,Y)\)的长度相等,这揭示了\(T\)的长度。让我们来看看当已知\(S\)和\(T\)的长度时,在什么条件下\(S\)和\(T\)满足\(f(S,T,X)=f(S,T,Y)\)。例题例如,当\(|S|=6\)和\(|T|=4\)时,让我们考虑当\(S+......
  • 洛谷P1001 A+B Problem的一些歪解(淼作)
    一、LCT#include<iostream>#include<cstring>#include<cstdio>#include<cstring>usingnamespacestd;structnode{intdata,rev,sum;node*son[2],*pre;booljudge();boolisroot();voidpushdown();voidupda......
  • 【简单菊花图】Codeforce 1583Problem - B.md
    1583Problem-B-Codeforces题目大意:n个点的无根树给出m个限制条件(a,c,b)在a到b路径上不能存在c点,求任意一种可能的树的所有边注意数据范围:1<m<n<1e5这说明了最多有n-1个限制条件这说明至少有一个点不存在限制条件即这个点可以作为根节点root连接其他所有点形成边......
  • CodeForces 1619D New Year's Problem
    题目链接:CodeForces1619D【NewYear'sProblem】思路    可以因为最多只能逛n-1个商店,当n-1大于等于m的时候,所有朋友都能取最大值,否则至少有两个人要选择相同的商店,所以依次枚举两个人选择同一个商店,其他人选择喜悦值最大的商店。代码#include<cstddef>#incl......