首页 > 编程语言 >算法刷题:图论(9.23,持续更)

算法刷题:图论(9.23,持续更)

时间:2023-09-24 14:12:24浏览次数:37  
标签:9.23 图论 vst int graph dfs boolean clr 刷题

目录

基础知识

  • 点:顶点、邻接节点
  • 边:有向边、无向边、加权边
  • 度:入度、出度、无向边的度
  • 环:环、自环(glist[i]中有i)
  • 连通性:连通图、不连通

有向图

顶点类

class Vertex {
   int id;
   List<Vertex> neighbors;
   // Vertex[] neighbors;
}

邻接表

// int值表示 顶点id
// 嵌套int列表
List<List<Integer>> glist;
// int列表数组
List<Integer>[] glist;
// 顶点列表
List<Vertex> glist;

邻接表有两个层级:

  1. 外层 - 顶点列表
  • 用一个列表存储顶点
  1. 内层 - 邻居列表
  • 每个顶点对应个邻居列表

邻接矩阵

// boolean 方阵
boolean [][] gmtx = new [n][n];
  • 每一个有向边都是矩阵的元素
  • 可以快速判断两个点是否邻接,但是费空间;

入度、出度

指向当前节点的箭头数、从当前节点指出的箭头数

有向加权图

邻接表:

  1. 顶点类实现
class Vertex {
	int id;
	int val;
	Vertex [] neighbors;
}
List<Vertex> glist;
  1. 直接存储:
// int数组的列表的数组
List<int[]>[] glist;
// int数组的列表的列表
List<List<int[]>> glist;

邻接矩阵:

int [][] gmtx = new [n][n];

无向图(双向图)

所有边的两边节点,都变成互相指向

图的遍历

系统栈 dfs 或者队列 bfs

图中包含 不连通子图 时的遍历思路:

// 遍历非连通图
for(int v = 0; v < g.length; v++){
	dfs[g, v];
	// if(!vst[v]) dfs(g, v);
}

题目

DAG所有可能的路径

时间 1ms,击败100%

class Solution {
	List<Integer> res;
	List<List<Integer>> ans;
	public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
		res = new ArrayList<>();
		ans = new ArrayList<>();
		dfs(graph, 0);
		return ans;
	}
	public void dfs(int [][] graph, int vid){
		res.add(vid);
		if(vid == graph.length - 1)
			ans.add(new ArrayList<>(res));
		for(int v : graph[vid])
			dfs(graph, v);
		res.remove(res.size() - 1);
	}
}

判断二分图

dfs解法

class Solution {
    // 记录 当前图 是否是 二分图
    private boolean isBip = true;
    private boolean [] clr;
    private boolean [] vst;
    public boolean isBipartite(int[][] graph) {
        clr = new boolean[graph.length];
        vst = new boolean[graph.length];
        // dfs(graph, 0);
        for(int i = 0; i < graph.length; i++){
            dfs(graph, i);
        }
        return isBip;
    }
    private void dfs(int [][] graph, int vid){
        // 已经判定不是二分图,不进行递归
        if(!isBip) return;
        vst[vid] = true;
        for(int v : graph[vid]){
            if(!vst[v]){
                // dfs(graph, v);
                clr[v] = !clr[vid];
                dfs(graph, v);
            } else {
                if(clr[v] == clr[vid]){
                    isBip = false;
                    return;
                }
            }
        }
    }
}

bfs解法

class Solution {
    // 记录 当前图 是否是 二分图
    private boolean isBip = true;
    private boolean [] clr;
    private boolean [] vst;
    public boolean isBipartite(int[][] graph) {
        clr = new boolean[graph.length];
        vst = new boolean[graph.length];
        // dfs(graph, 0);
        for(int v = 0; v < graph.length; v++){
            // if(!vst[v]) dfs(graph, v);
            // bfs(graph, v);
            if(!vst[v]) bfs(graph, v);
        }
        return isBip;
    }
    private void bfs(int [][] graph, int vid){
        Deque<Integer> dq = new ArrayDeque<>();
        dq.offer(vid);
        while(!dq.isEmpty() && isBip){
            int v = dq.poll();
            vst[v] = true;
            for(int w : graph[v]){
                // dq.offer(w);
                if(!vst[w]){
                    clr[w] = !clr[v];
                    dq.offer(w);
                } else {
                    if(clr[w] == clr[v])
                        isBip = false;
                }
            }
        }
    }

标签:9.23,图论,vst,int,graph,dfs,boolean,clr,刷题
From: https://www.cnblogs.com/luoyicode/p/17725921.html

相关文章

  • 2023.9.23——每日总结
    学习所花时间(包括上课):12h代码量(行):0行博客量(篇):1篇今天,上午做任务,下午完成任务。我了解到的知识点:1.一些电的知识,液压装置和机械结构,以及汇编语言的知识;2.由于昨天太劳累,忘记发博客,今日补上。明日计划:1.继续学习HTML;......
  • 9.23随笔
    1.上午图书馆开会,感觉就还是花了挺多时间在这些上面的,提升并不大,最多混个简历,也没扩大多少圈子,一周花三节值班,虽然也就是多个地方上自习,但我不是很喜欢被限制。2.今天注定是没写的一天,因为今天堕落。害,怎么回事!。能写的就是B站上一个视频看到的半导体行业的前景(链接附后),让那个......
  • 畅购商城学习日志9.23
    "message":"Contenttype'text/plain;charset=UTF-8'notsupported"--畅购商城学习日志导航:目录"message":"Contenttype'text/plain;charset=UTF-8'notsupported"--畅购商城学习日志导航:1.问题描述:2.思路经历:3.产生原因:4.解决方法:方法一1......
  • 9.23日记
    #text3_1入库CREATETEMPORARYFUNCTIONdboutputAS'org.apache.hadoop.hive.contrib.genericudf.example.GenericUDFDBOutput'selectdboutput('jdbc:mysql://localhost:3306/hive3?useSSL=false','root','pwd','INSERTINTOt......
  • 2023.9.23(我的第一次博客)
     现在是晚上九点三十一,我正坐在图书馆以此总结我一天的学习 早上七点半我来到这个位置完成老师所布置的作业,说实话我并不讨厌英语,我讨厌的是高中英语老师,讨厌的是是她那种死板的教学方法,大家也都挺讨厌的。我自认为目前对于英语的学习效率不高,两篇文章读了两三遍加上做题竟然......
  • 9.23日前遇到的问题及其解决
    问题1问题描述:在执行darknet转ncnn的操作时,报错,报错如下:darknet2ncnn:./src/utils.c:256:error:Assertion`0'failed.已放弃(核心已转储)原因:我的yolov4-tiny.cfg中的anchors在widows以矩阵的方式呈现,所以涉及到了换行,由于在Windows下换行符是\n\r,而Linux下则是\n,所以......
  • 9.23总结
    1.今天初步了解了echarts、ajax、json,完成了星期五的测试。2.本地数据库连接虚拟机的数据库;datagrip中连接虚拟机数据库,实现对虚拟机数据库的可视化。遇到的问题:echarts在页面的显示、ajax和json的结合使用、servlet中传json数据到echarts中,大部分的问题都已经解决了。......
  • 9.23栈的链式和数组实现
    //栈的链表实现importjava.util.Iterator;publicclassMain{publicstaticvoidmain(String[]args){LinkedListStack<Integer>l=newLinkedListStack<>(5);l.push(1);l.push(2);l.push(3);Iterator<Integer&g......
  • 【刷题笔记】60. Permutation Sequence(改)
    题目Theset [1,2,3,...,*n*] containsatotalof n!uniquepermutations.Bylistingandlabelingallofthepermutationsinorder,wegetthefollowingsequencefor n =3:"123""132""213""231""312"&quo......
  • 【刷题笔记】63. Unique Paths II
    题目Arobotislocatedatthetop-leftcornerofa m x n grid(marked'Start'inthediagrambelow).Therobotcanonlymoveeitherdownorrightatanypointintime.Therobotistryingtoreachthebottom-rightcornerofthegrid(marked'......