图论练习3

内容:过程中视条件改变边权,利用树状数组区间加处理


卯酉东海道

 题目链接

题目大意

  • n个点,m条有向边,每条边有颜色c_i和费用w_i
  • 总共有l种颜色
  • 若当前颜色与要走的边颜色相同,则花费为w_i
  • 若当前颜色与要走的边颜色不同,则花费为base*w_i,且颜色变为边的颜色
  • 出发时可以自定义颜色
  • 1\rightarrow n的最小花费 

解题思路 

  • 选边u\rightarrow v时,进行判断\left\{\begin{matrix} if\ c_u=c_{w(u,v)} &w(u,v)=w \\ else& w(u,v)=w*base,c_v=c_{w(u,v)} \end{matrix}\right.
  • 对于初始自定义颜色,且1\leq l\leq 64,则跑l趟最短路
import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
import java.util.StringTokenizer;public class Main{staticclass Node{int id;int col;long dis;public Node(int I,int C,long D) {id=I;col=C;dis=D;}}static int cnt=0;static int[] head;static Edge[] e;staticclass Edge{int fr;int to;int nxt;long val;int col;}static void addEdge(int fr,int to,long val,int col) {cnt++;e[cnt]=new Edge();e[cnt].fr=fr;e[cnt].to=to;e[cnt].val=val;e[cnt].nxt=head[fr];e[cnt].col=col;head[fr]=cnt;}public static void main(String[] args) throws IOException{AReader input=new AReader();PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));int n=input.nextInt();int m=input.nextInt();int l=input.nextInt();int base=input.nextInt();e=new Edge[m<<1|1];head=new int[n+1];for(int i=1;i<=m;++i) {int u=input.nextInt();int v=input.nextInt();int col=input.nextInt();long w=input.nextLong();addEdge(u, v, w,col);	}PriorityQueue<Node> que=new PriorityQueue<Node>((o1,o2)->{if(o1.dis-o2.dis>0)return 1;else if(o1.dis-o2.dis<0)return -1;else return 0;});boolean[] vis=new boolean[n+1];long[] dis=new long[n+1];long ans=Long.MAX_VALUE;for(int o=1;o<=l;++o) {Node s=new Node(1,o,0);Arrays.fill(vis, false);Arrays.fill(dis, Long.MAX_VALUE);dis[1]=0;que.add(s);while(!que.isEmpty()) {Node now=que.peek();que.poll();int u=now.id;if(vis[u])continue;long disu=now.dis;int colu=now.col;vis[u]=true;for(int i=head[u];i>0;i=e[i].nxt) {int v=e[i].to;int colv=e[i].col;long w=e[i].val;if(colv!=colu) {w=base*w;}if(dis[v]>disu+w) {dis[v]=disu+w;que.add(new Node(v, colv, dis[v]));}}}ans=Math.min(ans, dis[n]);}if(ans==Long.MAX_VALUE) {out.println(-1);}else {out.println(ans);}out.flush();out.close();}staticclass AReader{BufferedReader bf;StringTokenizer st;BufferedWriter bw;public AReader(){bf=new BufferedReader(new InputStreamReader(System.in));st=new StringTokenizer("");bw=new BufferedWriter(new OutputStreamWriter(System.out));}public String nextLine() throws IOException{return bf.readLine();}public String next() throws IOException{while(!st.hasMoreTokens()){st=new StringTokenizer(bf.readLine());}return st.nextToken();}public char nextChar() throws IOException{//确定下一个token只有一个字符的时候再用return next().charAt(0);}public int nextInt() throws IOException{return Integer.parseInt(next());}public long nextLong() throws IOException{return Long.parseLong(next());}public double nextDouble() throws IOException{return Double.parseDouble(next());}public float nextFloat() throws IOException{return Float.parseFloat(next());}public byte nextByte() throws IOException{return Byte.parseByte(next());}public short nextShort() throws IOException{return Short.parseShort(next());}public BigInteger nextBigInteger() throws IOException{return new BigInteger(next());}public void println() throws IOException {bw.newLine();}public void println(int[] arr) throws IOException{for (int value : arr) {bw.write(value + " ");}println();}public void println(int l, int r, int[] arr) throws IOException{for (int i = l; i <= r; i ++) {bw.write(arr[i] + " ");}println();}public void println(int a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}public void print(int a) throws IOException{bw.write(String.valueOf(a));}public void println(String a) throws IOException{bw.write(a);bw.newLine();}public void print(String a) throws IOException{bw.write(a);}public void println(long a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}public void print(long a) throws IOException{bw.write(String.valueOf(a));}public void println(double a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}public void print(double a) throws IOException{bw.write(String.valueOf(a));}public void print(char a) throws IOException{bw.write(String.valueOf(a));}public void println(char a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}}
}

AtCoder abc338 D - Island Tour

题目链接

题目大意 

  • n个点,n条无向边依次连接,第n条连接n\rightleftharpoons 1
  • 给定序列x_1,x_2\cdots x_k,从x_1依次访问
  • x_i\rightarrow x_j的路径长度,定义为经过的边的个数
  • 问删除一条边后,完成访问的最短路径长度

解题思路 

  • 先不管删边
  •  u\rightarrow v有两种方式,一种绕一圈,一种直接顺着走
  • 两种方式种的较小值加入答案
  • 但是有删边,所以删去边后可能导致取到较小值的路径无法通过,需要撤回,改为另一种
  • 若删除这条边,则通过它的所有较小值均要改变,即加上差值
  • 由于边标号连续,考虑树状数组区间加
  • 对于当前较小值经过的所有边,加上差值,作为撤回代价
  • 在不考虑删边的情况下统计完答案后,单点查询每条边,取撤回代价最小的边为删边
  • \left\{\begin{matrix} x_i<x_j &one:x_j-x_i&two:(n-x_j+1)+(x_i-1) \\ x_i>x_j & one :x_i-x_j&two:(n-x_i+1)+(x_j-1) \end{matrix}\right.
import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.PriorityQueue;
import java.util.StringTokenizer;public class Main{static int cnt=0;static int[] head;staticclass Edge{int fr;int to;int nxt;long val;}static Edge[] e;static void addEdge(int fr,int to,long val) {cnt++;e[cnt]=new Edge();e[cnt].fr=fr;e[cnt].to=to;e[cnt].nxt=head[fr];head[fr]=cnt;}staticclass Node{int x;long dis;long h;public Node(int X,long D,long H) {x=X;dis=D;h=H;}}staticclass BIT{int size;long[] tr;public BIT(int n) {size=n;tr=new long[n+2];}public int lowbit(int x) {return x&(-x);}public void update(int x,long y) {for(int i=x;i<=size;i+=lowbit(i)) {tr[i]+=y;}}public long query(int x) {long res=0;for(int i=x;i>0;i-=lowbit(i)) {res+=tr[i];}return res;}}public static void main(String[] args) throws IOException{AReader input=new AReader();PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));int n=input.nextInt();int m=input.nextInt();BIT Tree=new BIT(n);int[] X=new int[m+1];for(int i=1;i<=m;++i) {X[i]=input.nextInt();}long ans=0;for(int i=1;i<m;++i) {int x=X[i];int y=X[i+1];if(x==y)continue;long tol;long tor;long cha;if(x<y) {tol=(n+x-y);tor=(y-x);if(tol>tor) {ans+=tor;cha=tol-tor;Tree.update(x, cha);Tree.update(y, -cha);}else {ans+=tol;cha=tor-tol;Tree.update(1, cha);Tree.update(x,-cha);Tree.update(y, cha);Tree.update(n+1, -cha);}}else {tol=x-y;tor=n-x+y;if(tol>tor) {ans+=tor;cha=tol-tor;Tree.update(x, cha);Tree.update(n+1,-cha);Tree.update(1, cha);Tree.update(y, -cha);}else {ans+=tol;cha=tor-tol;Tree.update(y, cha);Tree.update(x, -cha);}}}long shan=Long.MAX_VALUE/2;for(int i=1;i<=n;++i) {shan=Math.min(shan, Tree.query(i));}
//	    out.println(ans);out.println(ans+shan);out.flush();out.close();}staticclass AReader {private BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));private StringTokenizer tokenizer = new StringTokenizer("");private String innerNextLine() {try {return reader.readLine();} catch (IOException ex) {return null;}}public boolean hasNext() {while (!tokenizer.hasMoreTokens()) {String nextLine = innerNextLine();if (nextLine == null) {return false;}tokenizer = new StringTokenizer(nextLine);}return true;}public String nextLine() {tokenizer = new StringTokenizer("");return innerNextLine();}public String next() {hasNext();return tokenizer.nextToken();}public int nextInt() {return Integer.parseInt(next());}public long nextLong() {return Long.parseLong(next());}public double nextDouble() {return Double.parseDouble(next());}}
}

AtCoder abc338 E - Chords

题目链接

题目大意 

  • 在一个圆上等距离放置了2n个点,从某个点开始顺时针编号为12n
  • 同时在圆上有n条弦,第i条弦连接点A_iB_i。保证所有的A_i,B_i,(i=1,2,\cdots n)不同
  • 判断这些弦是否有交

解题思路 

  • 集合划分
  • 若两个不同集合之间有弦,则有交
  • 由于点标号连续,对于每个弦,考虑树状数组区间加
  •  A_i\rightarrow B_i之间的点,区间加1,表示一个新集合
  • 端点无所谓,反正保证所有的A_i,B_i,(i=1,2,\cdots n)不同
  • query(A_i)\neq query(B_i),则A_i,B_i不在一个集合且有弦,满足有交
import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.PriorityQueue;
import java.util.StringTokenizer;public class Main{static int cnt=0;static int[] head;staticclass Edge{int fr;int to;int nxt;long val;}static Edge[] e;static void addEdge(int fr,int to,long val) {cnt++;e[cnt]=new Edge();e[cnt].fr=fr;e[cnt].to=to;e[cnt].nxt=head[fr];head[fr]=cnt;}staticclass Node{int x;long dis;long h;public Node(int X,long D,long H) {x=X;dis=D;h=H;}}staticclass BIT{int size;long[] tr;public BIT(int n) {size=n;tr=new long[n+2];}public int lowbit(int x) {return x&(-x);}public void update(int x,long y) {for(int i=x;i<=size;i+=lowbit(i)) {tr[i]+=y;}}public long query(int x) {long res=0;for(int i=x;i>0;i-=lowbit(i)) {res+=tr[i];}return res;}}public static void main(String[] args) throws IOException{AReader input=new AReader();PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));int n=input.nextInt();BIT Tree=new BIT(2*n);boolean ok=true;for(int i=1;i<=n;++i) {int x=input.nextInt();int y=input.nextInt();if(x>y) {int t=x;x=y;y=t;}if(!ok)continue;long fx=Tree.query(x);long fy=Tree.query(y);if(fx!=fy) {ok=false;}else {Tree.update(x, 1);Tree.update(y, -1);}}if(ok) {out.println("No");}else {out.println("Yes");}out.flush();out.close();}staticclass AReader {private BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));private StringTokenizer tokenizer = new StringTokenizer("");private String innerNextLine() {try {return reader.readLine();} catch (IOException ex) {return null;}}public boolean hasNext() {while (!tokenizer.hasMoreTokens()) {String nextLine = innerNextLine();if (nextLine == null) {return false;}tokenizer = new StringTokenizer(nextLine);}return true;}public String nextLine() {tokenizer = new StringTokenizer("");return innerNextLine();}public String next() {hasNext();return tokenizer.nextToken();}public int nextInt() {return Integer.parseInt(next());}public long nextLong() {return Long.parseLong(next());}public double nextDouble() {return Double.parseDouble(next());}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell脚本中的变量,运算符

1.脚本格式 我们一般将shell脚本写在xxx.sh文件中&#xff0c;执行的时候bash/sh xxx.sh 注意文件路径 xxx.sh文件中的第一行为 #!/usr/bin/bash 注代表我们使用的是bin文件夹下的bash解释器(此条为注释语句&#xff0c;不写也可以) 2.echo用法 相当与print 示例1&…

ASP.NET Core 自定义解压缩提供程序

写在前面 在了解ASP.NET Core 自定义请求解压缩中间件的应用时&#xff0c;依据官方文档操作下来碰到了几个问题&#xff0c;这边做个记录。 关键点就是配置 Content-Encoding&#xff0c;参数需要和代码中添加的提供程序的Key保持一致&#xff1b; builder.Services.AddRequ…

9、C语言复习

目录 1、位操作 2、define宏定义关键词 3、ifdef条件编译 4、extern变量申明 5、typedef类别别名 6、结构体 7、static关键字 1、位操作 &&#xff1a;按位与 |&#xff1a;按位或 ^&#xff1a;按位异或 ~&#xff1a;取反 <<&#xff1a;左移 >>…

【实战知识】使用Github Action + Nginx实现自动化部署

大家好啊,我是独立开发豆小匠。 先说一下背景~ 我的小程序:豆流便签,目前使用云托管部署后端服务,使用轻量级服务器部署数据库和一些中间件。 因此服务器成本:云托管 + 云服务器 云托管每周花费5元,一个月就是50,一年就是500啊,所以这期准备把云托管优化掉! 1. 需…

x-shell安装、使用以及配置cuda、cudnn和conda

x-shell安装、使用以及安装最新版本conda x-shell安装远程连接服务器conda安装和环境配置 x-shell安装 x-shell是一款终端模拟软件&#xff0c;用于在Windows界面下远程访问和使用不同系统下的服务器。免费版本下载地址&#xff1a; https://www.xshell.com/zh/free-for-home-…

【Django】如何设置支持多语种网站,中文/英文网站

首先&#xff0c;需要明确一点&#xff1a;我们要实现的中英对照翻译&#xff0c;这个翻译不是浏览器翻译的&#xff0c;也不是Django帮你翻译。这个需要你自己事先手动翻译好&#xff0c;存放在专门翻译文件中&#xff0c;Django只是事后调用而已。 第一步 新建项目后&#x…

[职场] 英语面试自我介绍 #微信#笔记#媒体

英语面试自我介绍 英语面试自我介绍1 I am very happy to introduce myself here.I was born in Liaoning Province.I graduated from Nankai University and majored in International Trade.I like music and reaing books,especially economical books.It is my honor to ap…

测试人员的自我修养

QAS:是负责检查和评估软件产品质量的专业人员&#xff0c;他们通过执行一系列测试来确保软件产品的功能、性能和安全性符合设计要求。 当产品上线后&#xff0c;有 bug&#xff1a; “测试为什么没有测试发现这个问题&#xff1f;肯定是测试的责任&#xff01;” 当产品上线…

LabVIEW CVT离合器性能测试

介绍了CVT&#xff08;连续变速器&#xff09;离合器的性能测试的一个应用。完成了一个基于LabVIEW软件平台开发的CVT离合器检测与控制系统&#xff0c;通过高效、准确的测试方法&#xff0c;确保离合器性能达到最优。 系统采用先进的硬件配合LabVIEW软件&#xff0c;实现了对…

C语言在Visual Studio 2010环境下使用<regex.h>正则表达式函数库

在Visual Studio 2010环境下&#xff0c;如果C语言想要使用<regex.h>头文件进行正则表达式匹配&#xff0c;则需要pcre3.dll这个动态链接库&#xff0c;可以去网上下载。 下载的网址是&#xff1a;Pcre for Windowspcre {whatisit}https://gnuwin32.sourceforge.net/pac…

[Python] scikit-learn中数据集模块介绍和使用案例

sklearn.datasets模块介绍 在scikit-learn中&#xff0c;可以使用sklearn.datasets模块中的函数来构建数据集。这个模块提供了用于加载和生成数据集的函数。 API Reference — scikit-learn 1.4.0 documentation 以下是一些常用的sklearn.datasets模块中的函数 load_iris() …

回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于OOA-LSSVM鱼鹰算法…

Python||五城P.M.2.5数据分析与可视化_使用华夫图分析各个城市的情况(下)

目录 沈阳市的空气质量 华夫图 柱状图 总结 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成都市&#xff0c;使用华夫图和柱状图分析各个城市的情况 沈阳市的空气质量 华夫图 import numpy as np import pandas as pd import matplotlib.pyplot as plt …

TorchVision的使用方法、更改默认路径

TorchVision的使用 1. 转换和增强图像 torchvision.transforms.v2 参数作用Resize将输入调整为给定大小RandomShortestSize随机调整输入的大小RandomResize随机调整输入的大小RandomCrop在随机位置裁剪输入RandomResizedCrop裁剪输入的随机部分并将其调整为给定大小RandomIoU…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-11-playwright操作iframe-上篇

1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了&#xff0c;因为前边的窗口切换就为这种网页处理提供了思路&#xff0c;另一个原因就是虽然iframe很强大&#xff0c;但是现在很少有网站用它了。但是还是有小伙伴或者童鞋们私下问这个问题&#xff0c;那么宏哥就…

【后端开发】正向代理与反向代理

正向代理 正向代理&#xff08;forward proxy&#xff09;&#xff1a;是一个位于客户端和目标服务器之间的服务器(代理服务器)&#xff0c;为了从目标服务器取得内容&#xff0c;客户端向代理服务器发送一个请求并指定目标&#xff0c;然后代理服务器向目标服务器转交请求并将…

BUUCTF-Real-[ThinkPHP]2-Rce1

任意代码执行漏洞 ThinkPHP 2.x版本中&#xff0c;使用preg_replace的/e模式匹配路由&#xff1a; $res preg_replace((\w).$depr.([^.$depr.\/])e, $var[\\\1\]"\\2";, implode($depr,$paths)); 导致用户的输入参数被插入双引号中执行&#xff0c;造成任意代码执行…

Open CASCADE学习|拓扑变换

目录 平移变换 旋转变换 组合变换 通用变换 平移变换 TopoDS_Shape out;gp_Trsf theTransformation;gp_Vec theVectorOfTranslation(0., 0.125 / 2, 0.);theTransformation.SetTranslation(theVectorOfTranslation);BRepBuilderAPI_Transform myBRepTransformation(out, th…

Leetcode刷题笔记题解(C++):36. 有效的数独

思路一&#xff1a;暴力破解&#xff0c;两个二维数组记录行、列对应的数字出现的次数&#xff0c;比如rows[i][index]表示的数字index在i行出现的次数&#xff0c;三维数组记录每个块中对应数字出现的次数&#xff0c;比如boxes[i/3][j/3][index]表示的数字index在[i/3][j/3]个…

校园墙表白墙系统uniapp微信小程序

配置文件 (自动编号、配置参数名称、配置参数值)&#xff1b; 前端开发:vue 语言&#xff1a;javapythonnodejsphp均支持 运行软件:idea/eclipse/vscode/pycharm/wamp均支持 框架支持:Ssm/django/flask/thinkphp/springboot/springcloud均支持 数据库 mysql 数据库工具&#x…