图论练习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.rhkb.cn/news/251687.html

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

相关文章

Java面试——计网篇

一、基础篇 1、 TCP/IP 网络模型 对于同一台设备上的进程间通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;而对于不同设备上的进程间通信&#xff0c;就需要网络通信&#xff0c;而设备是多样性的&#xff0c;所以要兼容多…

【Java程序设计】【C00245】基于Springboot的家政服务管理平台(有论文)

基于Springboot的家政服务管理平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的家政服务管理平台 本系统分为前台模块、管理员功能模块、用户功能模块以及服务人员功能模块。 前台模块&#xff1a;系统首页的…

C2-Search-Netlas:一款基于Netlas API的强大C2服务器识别与检测工具

关于C2-Search-Netlas C2-Search-Netlas是一款功能强大的命令与控制&#xff08;C2&#xff09;服务器检测工具&#xff0c;该工具使用Java语言开发&#xff0c;基于Netlas API实现其功能&#xff0c;可以帮助广大研究人员轻松快速地识别和检测目标C2服务器的相关信息。 C2-S…

【目标跟踪】相机运动补偿

文章目录 一、前言二、简介三、改进思路3.1、状态定义3.2、相机运动补偿3.3、iou和ReID融合3.4、改进总结 四、相机运动补偿 一、前言 目前 MOT (Multiple Object Tracking) 最有效的方法仍然是 Tracking-by-detection。今天给大家分享一篇论文 BoT-SORT。论文地址 &#xff0…

XCTF:warmup[WriteUP]

CtrlU查看页面源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible&q…

【Matplotlib】figure方法之图形的保存

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;matplotlib &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

idea常用设置

1、内存优化 根据自己电脑本身的内存&#xff0c;对idea安装包里bin目录下的idea64.exe.vmoptions文件进行修改 -server -Xms256m -Xmx2048m -XX:MaxPermSize1024m -XX:ReservedCodeCacheSize256m -ea -Dsun.io.useCanonCachesfalse -Djava.Net.preferIPv4Stacktrue -Djsse.e…

STM32--HAL库定时器学习记录(易懂)--持续学习

一、什么是定时器 定时器就是计数器&#xff0c;通过计数完成一系列功能。 二、定时器的分类 定时器分为基本定时器、通用定时器、高级定时器。级别不同&#xff0c;功能不同。级别越高&#xff0c;功能越强。 三、定时器&#xff08;计数器&#xff09;三个重要寄存器 预分…

CSS:水平垂直居中

公共的 CSS 样式&#xff1a; .parent {width: 300px;height: 300px;background-color:#d0e4fe; }.child {width: 100px;height: 100px;background-color:orange; }HTML: <div class"parent"><div class"child"></div> </div>最…

C#之linq和lamda表达式GroupBy分组拼接字符串

文章目录 C#之linq和lamda表达式GroupBy分组拼接字符串业务需求核心代码调试 C#之linq和lamda表达式GroupBy分组拼接字符串 业务需求 点击提示信息&#xff0c;如&#xff1a;“售后单【SH001】序列号【001&#xff0c;002&#xff0c;006】&#xff1b;售后单【SH002】序列号…

华为自动驾驶干不过特斯拉?

文 | AUTO芯球 作者 | 李诞 什么&#xff1f; 华为的智能驾驶方案干不过蔚小理&#xff1f; 特斯拉的智能驾驶[FSD]要甩中国车企几条街&#xff1f; 这华为问界阿维塔刚刚推送“全国都能开”的城区“无图 NCA” 就有黑子来喷了 这是跪久了站不起来了吧 作为玩车14年&…

flask_django_python五金电商网络营销的可视化分析研究

前面部分完成了系统需求分析&#xff0c;了解到新闻数据业务方面的需求&#xff0c;系统主要分为用户管理、五金信息管理、在线留言、系统管理等功能。销的可视化研究&#xff0c;并对这些数据进行处理&#xff0c; 然后对这些数据进行可视化分析和统计。 Python 爬虫技术目前来…

【华为】GRE VPN 实验配置

【华为】GRE VPN 实验配置 前言报文格式 实验需求配置思路配置拓扑GRE配置步骤R1基础配置GRE 配置 ISP_R2基础配置 R3基础配置GRE 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立 配置文档 前言 VPN &#xff1a;&#xff08;Virtual Private Network&#xff09;&#xff0c;即“…

Electron实战(二):将Node.js和UI能力(app/BrowserWindow/dialog)等注入html

文章目录 设置webPreferences参数安装electron/remotemain进程中初始化html中使用dialog踩坑参考文档 上一篇&#xff1a;Electron实战(一)&#xff1a;环境搭建/Hello World/打包exe 设置webPreferences参数 为了能够在html/js中访问Node.js提供fs等模块&#xff0c;需要在n…

Django的web框架Django Rest_Framework精讲(二)

文章目录 1.自定义校验功能&#xff08;1&#xff09;validators&#xff08;2&#xff09;局部钩子&#xff1a;单字段校验&#xff08;3&#xff09;全局钩子&#xff1a;多字段校验 2.raise_exception 参数3.context参数4.反序列化校验后保存&#xff0c;新增和更新数据&…

20240131在ubuntu20.04.6下使用whisper不同模式的比对

20240131在ubuntu20.04.6下使用whisper不同模式的比对 2024/1/31 16:07 首先你要有一张NVIDIA的显卡&#xff0c;比如我用的PDD拼多多的二手GTX1080显卡。【并且极其可能是矿卡&#xff01;】 2、请正确安装好NVIDIA最新的驱动程序和CUDA。可选安装&#xff01; 3、配置whisper…

【Linux取经路】进程控制——程序替换

文章目录 一、单进程版程序替换看现象二、程序替换的基本原理三、程序替换接口学习3.1 替换自己写的可执行程序3.2 第三个参数 envp 验证四、结语一、单进程版程序替换看现象 #include <stdio.h> #

深入理解Istio服务网格(一)数据平面Envoy

一、服务网格概述(service mesh) 在传统的微服务架构中&#xff0c;服务间的调用&#xff0c;业务代码需要考虑认证、熔断、服务发现等非业务能力&#xff0c;在某种程度上&#xff0c;表现出了一定的耦合性 服务网格追求高级别的服务流量治理能力&#xff0c;认证、熔断、服…

【Spring】自定义注解 + AOP 记录用户的使用日志

目录 ​编辑 自定义注解 AOP 记录用户的使用日志 使用背景 落地实践 一&#xff1a;自定义注解 二&#xff1a;切面配置 三&#xff1a;Api层使用 使用效果 自定义注解 AOP 记录用户的使用日志 使用背景 &#xff08;1&#xff09;在学校项目中&#xff0c;安防平台…

vue2 el-table新增行内删除行内(两种写法)里面第一个是树组件,第二个是数字组件,第一个数组件只能勾选最后一个节点

第一种 <template><div class"time_table"><div style"margin-bottom: 10px"><el-button click"addRowFn">新增</el-button></div><el-form ref"costForm" :model"formData">&l…