图论练习3

news2024/11/28 22:35:56

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


卯酉东海道

 题目链接

题目大意

  • 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{
	static
	class 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;
	static
	class 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();
	}
	
	static
	class 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;
	static
	class 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;
	}
	static
	class Node{
		int x;
		long dis;
		long h;
		public Node(int X,long D,long H) {
			x=X;
			dis=D;
			h=H;
		}
	}
	static
	class 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();
	}
	
	static
    class 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;
	static
	class 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;
	}
	static
	class Node{
		int x;
		long dis;
		long h;
		public Node(int X,long D,long H) {
			x=X;
			dis=D;
			h=H;
		}
	}
	static
	class 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();
	}
	
	static
    class 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.coloradmin.cn/o/1432552.html

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

相关文章

Android学习之路(27) ProGuard,混淆,R8优化

前言 使用java编写的源代码编译后生成了对于的class文件&#xff0c;但是class文件是一个非常标准的文件&#xff0c;市面上很多软件都可以对class文件进行反编译&#xff0c;为了我们app的安全性&#xff0c;就需要使用到Android代码混淆这一功能。 针对 Java 的混淆&#x…

【快速上手QT】01-QWidgetQMainWindow QT中的窗口

总所周知&#xff0c;QT是一个跨平台的C图形用户界面应用程序开发框架。它既可以开发GUI程序&#xff0c;也可用于开发非GUI程序&#xff0c;当然我们用到QT就是要做GUI的&#xff0c;所以我们快速上手QT的第一篇博文就讲QT的界面窗口。 我用的IDE是VS2019&#xff0c;使用QTc…

Leetcode高频题:213打家劫舍II

题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个…

MySQL知识点总结(三)——事务

MySQL知识点总结&#xff08;三&#xff09;——事务 事务事务的四大特性ACID原子性一致性隔离性持久性 脏读、幻读、不可重复读脏读不可重复读幻读 隔离级别读未提交读已提交可重复读串行化 事务的原理InnoDB如何实现事务的ACID事务的两阶段提交redo log与binlog的区别事务两阶…

基于SpringBoot+Vue的在线教育平台设计与实现

目录 项目介绍 技术栈 项目介绍 项目截图 搭建 代码截取 代码获取 项目介绍 近年由于疫情影响&#xff0c;线下教育行业受到较大冲击&#xff0c;因此线上教育培训有较好的发展势头&#xff0c;其中建筑行业考证培训是一个前景良好的发展方向&#xff0c;该行业不仅需要…

权威认可|亚数强势入围FreeBuf《CCSIP 2023中国网络安全产业全景图》10大细分领域

近日&#xff0c;国内安全行业门户FreeBuf旗下FreeBuf咨询正式发布《CCSIP&#xff08;China Cyber Security Industry Panorama&#xff09;2023中国网络安全行业全景册&#xff08;第六版&#xff09;》。 凭借卓越的技术产品能力、市场影响力及领先的综合实力&#xff0c;亚…

C++泛编程(3)

类模板基础 1.类模板的基本概念2.类模板的分文件编写3.类模板的嵌套 &#xff08;未完待续...&#xff09; 在往节内容中&#xff0c;我们详细介绍了函数模板&#xff0c;这节开始我们就来聊一聊类模板。C中&#xff0c;类的细节远比函数多&#xff0c;所以这个专题也会更复杂。…

【Crypto | CTF】BUUCTF 萌萌哒的八戒

天命&#xff1a;这年头连猪都有密码&#xff0c;真是奇葩&#xff0c;怪不得我一点头绪都没有 拿到软件&#xff0c;发现是.zip的压缩包&#xff0c;打不开&#xff0c;改成7z后缀名&#xff0c;打开了 发现是一张图片 也只有下面这行东西是感觉是密码了&#xff0c;又不可能…

[leetcode] 22. 括号生成

文章目录 题目描述解题方法方法一&#xff1a;dfs遍历java代码 方法二&#xff1a;按照卡特兰数的思路递归求出有效括号组合java代码 相似题目 题目描述 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示…

计算机编码:原码、反码、补码的思想、原理和实例(详细版)

​ 目录 收起 一、原码、反码、补码的意义 意义&#xff1a; 三、原码 原码的特点&#xff1a; 原码存在的问题&#xff1a; 四、反码 反码的特点&#xff1a; 存在的问题&#xff1a; 五、补码 六、补码的思想&#xff08;模&&同余数&#xff09; 模 && 同余数…

exF2FS: Transaction Support in Log-Structured Filesystem——泛读笔记

FAST 2022 Paper 分布式元数据论文汇总 问题 现代应用程序努力以崩溃一致的方式保护其数据&#xff0c;这通常分布在多个文件抽象之上。在底层文件系统缺乏事务支持的情况下&#xff0c;应用程序使用复杂的协议来确保跨多个文件的事务性更新&#xff0c;产生长序列的写操作和…

小林Coding_操作系统_读书笔记

一、硬件结构 1. CPU是如何执行的 冯诺依曼模型&#xff1a;中央处理器&#xff08;CPU&#xff09;、内存、输入设备、输出设备、总线 CPU中&#xff1a;寄存器&#xff08;程序计数器、通用暂存器、指令暂存器&#xff09;&#xff0c;控制单元&#xff08;控制CPU工作&am…

自研人工智能小工具-小蜜蜂(国外ChatGpt的平替)

国内有非常多好用的人工智能工具&#xff0c;但均无法完全替代国外ChatGpt。 ChatGPT相较于其他国内工具的优势在于以下几点&#xff1a; 创新的语言生成能力&#xff1a;ChatGPT是由OpenAI开发的先进的自然语言生成模型&#xff0c;它采用了大规模的预训练和精细调整方法。因此…

蓝桥杯刷题day06——平均

1、题目描述 有一个长度为n 的数组&#xff08;n 是 10 的倍数&#xff09;&#xff0c;每个数ai都是区间 [0,9] 中的整数。 小明发现数组里每种数出现的次数不太平均&#xff0c;而更改第i 个数的代价为bi&#xff0c; 他想更改若干个数的值使得这10 种数出现的次数相等&…

创建TextMeshPro字体文件

相比于Unity的Text组件&#xff0c;TextMesh Pro提供了更强大的文本格式和布局控制&#xff0c;更高级的文本渲染技术&#xff0c;更灵活的文本样式和纹理支持&#xff0c;更好的性能以及更易于使用的优点。但unity自带TextMeshPro字体不支持中文。这里使用普通字体文件生成Tex…

前端登陆加密解决方案

项目背景 环食药烟草的数据下载模块中&#xff0c;需要判断用户在进行数据下载时是进行了登录操作&#xff0c;如果没有登录要跳转登陆页面&#xff0c;输入账号和密码进行登录。 使用场景 项目中需要前端书写登录页面&#xff0c;用户输入账号密码&#xff0c;前端获取到用…

Allegro中设置让Route Keepout(禁止布线区)允许布线或打过孔的方法

Allegro中设置让Route Keepout&#xff08;禁止布线区&#xff09;允许布线或打过孔的方法 Chapter1 Allegro中设置让Route Keepout&#xff08;禁止布线区&#xff09;允许布线或打过孔的方法一、前言二、设置方法 Chapter2 Cadence Allegro PCB设计88问解析(二十三) 之 Alleg…

QT中QComboBox添加点击事件,实现下拉框自动刷新

因为项目需要&#xff0c;在QT中的ui界面添加QComboBox控件&#xff0c;需求是实现控件的点击事件&#xff0c;查了资料&#xff0c;发现这个控件类的本身是没有点击信号可以使用的。 但是QT是基于C的面向对象&#xff0c;有了这个特点&#xff0c;我们就可以继承原来的类&…

认识Tomcat (一)

认识Tomcat &#xff08;一&#xff09; 一、服务器 1.1 服务器简介 ​ 硬件服务器的构成与一般的PC比较相似&#xff0c;但是服务器在稳定性、安全性、性能等方面都要求更高&#xff0c;因为CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。 ​ 软件服务器&…

Docker 搭建mysql 集群(二)

PXC方案 很明显 PXC方案在任何一个节点写入的数据都会同步到其他节点&#xff0c;数据双向同步的&#xff08;在任何节点上都可以同时读写&#xff09; 创建MySQL PXC集群 1 安装PXC镜像 docker pull percona/percona-xtradb-cluster:5.7.21 2 为PXC镜像改名 docker tag pe…