首页 > 其他分享 >做题笔记(三)

做题笔记(三)

时间:2024-08-12 20:28:55浏览次数:15  
标签:中枢 int 笔记 read MAXN id dis

[USACO13DEC] Vacation Planning G

题目传送门

[USACO13DEC] Vacation Planning G

思路

总结:一点点小思维+最短路板子。

显然我们发现,对于每一次询问的出发点 \(u\) 只有两种可能:是中枢或者不是中枢。

同时注意到,\(K\) 的范围非常小,所以可以考虑在中枢上做文章。我们可以先试着在 \(K\) 个中枢中跑 \(K\) 遍最短路。然后分类讨论(假定中枢点集合为 \(S\)):

  • \(u\in S\):显然我们已经处理过了 \(u\) 的最短路,所以我们可以直接判断 \(u\) 是否可以到 \(v\) 并且很快查询其花费。

  • \(u\notin S\):根据题目性质可以得出每一个与 \(u\) 相连的节点 \(w\) 都满足 \(w\in S\),而每一个 \(w\) 的最短路也已知,所以可以遍历一遍 \(u\) 所能到达的点再查询花费。

注意到每一个中枢的范围在 \([1,N]\),似乎二维的最短路数组存不下,那就先给它离散化一下吧,这样每一个中枢的范围就控制在了 \([1,K]\)。

似乎 SPFA 都可以跑过去,但我们还是选择 Dijkstra。

最坏时间复杂度为 \(O(KN\log(N+M)+KQ)\)。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;

inline int read(){
    int x=0,f=1;
    char c=getchar();

    for(;c<'0'||c>'9';c=getchar())
        if(c=='-') f=-1;

    for(;c>='0'&&c<='9';c=getchar())
        x=x*10+c-'0';

    return x*f;
}

inline void Write(int x){
    if(x<0){
        putchar('-');
        x=-x;
    }

    if(x>9) Write(x/10);

    putchar(x%10+'0');
}

inline void write(int x){
    Write(x);
    putchar('\n');
}

const int MAXN=20005,MAXK=205;
int n,m,k,q;
vector<pair<int,int> >V[MAXN];
int hub[MAXK],id[MAXN]={0},cnt=0;
int dis[MAXK][MAXN],tot=0,ans=0;
bool vis[MAXN]={0},ishub[MAXN]={0};

void dijkstra(int s){
	for(int i=1;i<=n;i++)
		vis[i]=0;
	
	priority_queue<pair<int,int> >q;
	dis[id[s]][s]=0;
	q.push(make_pair(0,s));
	
	while(!q.empty()){
		int t=q.top().second;
		q.pop();
		
		if(vis[t]) continue;
		else vis[t]=1;
		
		for(int i=0;i<V[t].size();i++){
			int to=V[t][i].first;
			int w=V[t][i].second;
			
			if(dis[id[s]][to]>dis[id[s]][t]+w){
				dis[id[s]][to]=dis[id[s]][t]+w;
				q.push(make_pair(-dis[id[s]][to],to));
			}
		}
	}
}

signed main(){
	n=read(),m=read();
	k=read(),q=read();
	
	for(int i=1;i<=k;i++)
		for(int j=1;j<=n;j++)
			dis[i][j]=1e17;
	
	for(int i=1;i<=m;i++){
		int u=read(),v=read(),w=read();
		V[u].push_back(make_pair(v,w));
	}
	
	for(int i=1;i<=k;i++){
		hub[i]=read();
		ishub[hub[i]]=1;
		id[hub[i]]=(++cnt);
	}
	
	for(int i=1;i<=k;i++)
		dijkstra(hub[i]);
		
	while(q--){
		int u=read(),v=read();
		
		if(ishub[u]){
			if(dis[id[u]][v]!=1e17){
				tot++;
				ans+=dis[id[u]][v];
			}
		}
		else{
			int mn=1e17;
			
			for(int i=0;i<V[u].size();i++){
				int to=V[u][i].first;
				int w=V[u][i].second;
				mn=min(dis[id[to]][v]+w,mn);
			}
			
			if(mn!=1e17){
				tot++;
				ans+=mn;
			}
		}
	}
	
	write(tot);
	write(ans);

    return 0;
}

标签:中枢,int,笔记,read,MAXN,id,dis
From: https://www.cnblogs.com/snapyust/p/18355678

相关文章

  • 差分约束 笔记
    差分约束笔记给定约束\(n\)个未知数的\(m\)个约束条件,求满足条件的未知数的其中一个整数解。\(m\)个约束条件如下:\[\left\{\begin{matrix} x_{c_1}+w_1\gex_{c'_1}\\ x_{c_2}+w_2\gex_{c'_2}\\ x_{c_3}+w_3\gex_{c'_3}\\ \dots\\ x_{c_m}+w_m\ge......
  • UE5学习笔记9-创建一个小窗口提示人物是否和武器重叠
    一、目标    创建一个UsrWidget去显示如果人物和武器重叠显示窗口,如果人物和武器不重叠将窗口隐藏二、创建窗口并显示    1.创建一个窗口蓝图类,命名为PickUpWidget,这个蓝图类不需要C++类,在对应文件夹中单机右键选择用户界面的控件蓝图    2.在界......
  • Java学习笔记4--Java跨平台原理
    一、Java程序运行机制计算机高级语言按照程序的执行方式可以分为编译型语言和解释型语言。编译型语言:编写的程序源代码需要通过编译器生成机器语言目标文件,在计算机上直接执行目标文件。编译型语言的代表是C、C++等。解释型语言:源代码被解释器逐行解释并执行,因此无需编译器生......
  • 积性函数和狄利克雷卷积学习笔记
    积性函数和狄利克雷卷积学习笔记积性函数定义若函数\(f(x)\)满足\(f(ab)=f(a)f(b)\),其中\(a,b\)互质,我们称这个函数是积性函数。若\(a,b\)不互质则是完全积性函数。常见积性函数狄利克雷卷积定义也叫狄利克雷乘积。形如下式:\[h(n)=\sum_{ab=n,a>0,b>0}f(a)g(b)\]......
  • Java学习笔记3--java编译和运行的CMD命令
    windows下利用cmd命令行可以调用jdk里的javac.exe和java.exe对java文件进行编译和执行,前提是jdk已成功安装并正确配置相关环境变量执行命令解析:javac命令用于将java源文件编译为class字节码文件,如:javacHelloWorld.java。运行javac命令后,如果成功编译没有错误的话,会出现......
  • 《ImageNet: A Large-Scale Hierarchical Image Database》李飞飞论文阅读笔记
    OpenSNN开思通智网,官网地址:https://w3.opensnn.com/2024年8月份"O站创作者招募计划"快来O站写文章,千元大奖等你来拿!“一起来O站,玩转AGI!”论文地址:《ImageNet:ALarge-ScaleHierarchicalImageDatabase》这篇论文是关于一个叫做“ImageNet”的大型图像数据库的介绍。......
  • opencv学习笔记(一)
    前言本文为本人观看b站视频学习opencv的笔记分享,如有错误欢迎指正,如有侵权联系我删除,视频链接一、ReadImagesVideosandWebcams#include<opencv2/imgcodecs.hpp>#include<opencv2/highgui.hpp>#include<opencv2/imgproc.hpp>#include<iostream>usingnamespaces......
  • 《数据资产管理核心技术与应用》读书笔记-第三章:数据血缘
    《数据资产管理核心技术与应用》是清华大学出版社出版的一本图书,全书共分10章,第1章主要让读者认识数据资产,了解数据资产相关的基础概念,以及数据资产的发展情况。第2~8章主要介绍大数据时代数据资产管理所涉及的核心技术,内容包括元数据的采集与存储、数据血缘、数据质量、数据监控与......
  • Java基础-学习笔记08
    01类变量、类方法、main方法、代码块类变量(静态变量)类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。关于静态变量在内存中的存放地址,有两种说法,①认为静态变量......
  • leetcode刷题笔记8.5-8.9
    刷题笔记8.5-8.9刷题顺序依照labuladong算法小抄两数之和(8.5)初始化数组:int[]num=newint<length>;int[]num={1,2,3,4};其中数组名代表指针变量,故不可以直接将数组名a赋值给数组名b错误的复制:int[]b=a;数组元素复制:假设数组nums的元素复制到numsSort中:int[]......