首页 > 其他分享 >题解:如何得到npy

题解:如何得到npy

时间:2022-09-04 23:44:46浏览次数:84  
标签:val 如何 int 题解 vis read while npy dis

如何得到npy

题目链接

普及组模拟赛良心第四题,感觉比第三题简单捏。

这道题分成两问。对于前一问,简化题意是给定一棵有 \(n\) 个点的树,给定两个起点 \(s\) 和 \(t\),求一个两个起点的“单”源最短路径。板子题咯,初始的优先队列把两个点都放进去就好了。

对于第二问,我们观察样例就可以发现,不管怎么构造,都只会有一个 \(0\)。手玩一下这个 \(0\) 的位置,容易得到实际上整棵树上的点被分为了两部分,一部分是最短路的起点为 \(s\),另一部分是最短路的起点为 \(t\),而那个 \(0\) 则恰好是两大部分交界的位置。

因此有一种构造方法,就是在跑最短路的时候记录下每一个点是由谁扩展来的,然后最后遍历一下每一条边判断方向即可。

\(Code\)

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

inline int read()
{
	int s=0,w=1;
	char c=getchar();
	while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
	while(isdigit(c)) s=(s<<1)+(s<<3)+(c^48),c=getchar();
	return s*w;
}

int n,s,t;
int x,y,z;
int ans,lis[MAX];

struct edge
{
	int nex,to,val;
	int id;
}e[MAX<<1];
int head[MAX<<1],cnt,from[MAX<<1];
inline void add(int x,int y,int z,int id)
{
	cnt++;
	e[cnt].nex=head[x];
	e[cnt].to=y;
	e[cnt].val=z;
	e[cnt].id=id;
	head[x]=cnt;
	return;
}
inline bool cmp(edge a,edge b)
{
	return a.id<b.id;
}

int dis[MAX],vis[MAX];
priority_queue<pair<int,int> > q;
inline void dijkstra()
{
	memset(dis,0x3f,sizeof dis);
	memset(vis,0,sizeof vis);
	dis[s]=0,dis[t]=0;
	q.push(make_pair(0,s)),q.push(make_pair(0,t));
	while(!q.empty())
	{
		int t=q.top().second; q.pop();
		if(vis[t]) continue;
		vis[t]=1;
		for(int i=head[t];i;i=e[i].nex)
		{
			int to=e[i].to,val=e[i].val;
			if(dis[to]>dis[t]+val)
			{
				dis[to]=dis[t]+val;
				from[to]=t;
				q.push(make_pair(-dis[to],to));
			}
		}
	}
	return;
}

signed main()
{
	n=read(),s=read(),t=read();
	for(int i=1;i<n;++i)
		x=read(),y=read(),z=read(),add(x,y,z,i),add(y,x,z,i+n);
	dijkstra();
	for(int i=1;i<=n;++i)
		ans+=dis[i];
	cout<<ans<<endl;
	for(int i=1;i<=n;i++)
	{
		for(int j=head[i];j;j=e[j].nex)
		{
			int to=e[j].to,id=e[j].id;
			if(e[j].id>n) continue;
			if(from[to]==i)
				lis[id]=2;
			if(from[i]==to)
				lis[id]=1;
		}
	}
	for(int i=1;i<n;i++)
		cout<<lis[i];
	return (0-0);
}

标签:val,如何,int,题解,vis,read,while,npy,dis
From: https://www.cnblogs.com/LittleTwoawa/p/16656536.html

相关文章

  • 第三方库openPyxl读取excel文件
    importopenpyxlfromopenpyxl.worksheet.worksheetimportWorksheetdefopenpyxl_read():#1、打开文件workbook=openpyxl.load_workbook("cases.xlsx")......
  • 如何获取C++中变量/表达式的类型
    主要有三种方式:使用C++库自带的typeid函数;使用boost库中type_id_with_cvr函数(末尾的cvr代表const,variable,reference);自定义模板函数type_name();方式一......
  • 【PR】如何裁剪视频得页面?
    【PR】如何裁剪视频得页面?选择视频轨道|效果|裁剪(可以搜索)|调整上下左右需要裁剪的大小|选择缩放,去掉黑边......
  • 倍福PLC与基恩士扫码器SR1000的设置与程序中如何实现解码
    基恩士扫码器软件安装包地址:链接:https://pan.baidu.com/s/1zX_kbIi-lpn-O8drUErlow提取码:30231.首先进行对象的搜寻与配置 2.设置图像界面与如何保证每次都扫码成......
  • 如何学习一门新的编程
    工作之后要学习Verilog,从来没有接触过这门语言,于是发起了一个提问:如何学习一门新的编程语言?收到的答案有几种:跟着B站学习,看官方文档,直接用,做几个感兴趣的小项目,还有个姐妹......
  • 如何使用 ABAP 代码解析 XML 文件
    正如本教程的开篇介绍文章SAPOData开发教程-从入门到提高(包含SEGW,RAP和CDP)所提到的,SAPOData服务开发,从实现技术上来说,可以分为三大类。因此本教程也分为三大......
  • 如何创建一个socket连接?
    如何创建一个socket连接?java方式流程简化概述:客户端1.首先客户端使用newsocket()方法创建一个客户端的Socket;2.然后调用bind()方法绑定到一个本地的ip和port,这里por......
  • 1530 bingo 不是题解
    *2600的死活卡住出不来,想啊,很想啊(指remake21*21的方阵,每个位置有一个概率是1,求凑出来bingo的概率这种题目先考虑容斥,那就是1-凑不出bingo的概率。直接做是2^44的,我做牛......
  • 如何不编写 YAML 管理 Kubernetes 应用?
    Kubernetes将自身边界内的事物都抽象为资源。其中的主要部分,是以Deployment、StatefulSet为代表的workload工作负载控制器,其他各类资源都围绕这些主要的资源工作。这......
  • Linux系统如何查看版本信息
    Linux系统如何查看版本信息-百度经验 https://jingyan.baidu.com/article/7908e85c725159af481ad2f7.html方法/步骤 输入"uname-a",可显示电脑以及操作系统的......