【數據結構基礎筆記】【圖】

代碼參考《妙趣橫生的算法.C語言實現》

文章目錄

  • 前言
  • 1、圖的概念
  • 2、圖的存儲形式
    • 1、鄰接矩陣:
    • 2、鄰接表
    • 3、代碼定義鄰接表
  • 3、圖的創建
  • 4、深度優先搜索DFS
  • 5、廣度優先搜索BFS
  • 6、實例分析


前言

本章總結:圖的概念、圖的存儲形式、鄰接表定義、圖的創建、圖的遍歷(DFS、BFS)、
以及最后給出一個實例分析


1、圖的概念

圖是由頂點的非空有限集合V與邊的集合E(頂點之間的關系)所構成。
圖分為有向圖和無向圖。

2、圖的存儲形式

最常見的兩種:鄰接矩陣、鄰接表

1、鄰接矩陣:

利用兩個數組來存儲一個圖。
第一個數組為一維數組,用來存放圖中的數據。vertex[0,1,…,n-1]:存儲頂點信息
第二個數組為二維數組,用來存儲頂點的相互關系,稱為鄰接矩陣。
A[i][j]={1,當頂點i與頂點j之間有邊 0,當頂點i與頂點j之間沒有邊}

有向圖
有向圖的鄰接矩陣

通過簡單的鄰接矩陣就可以把一個復雜的圖關系表現出來,不過該方法不適合存儲稀疏圖(邊數目少的圖)

2、鄰接表

鄰接表由鏈表和順序數組組成。鏈表用來存放邊的信息,數組用來存放頂點的數據信息。
每一個頂點分別建立一個鏈表。
每個鏈表前面設置一個頭結點,頂點域vertex用來存放頂點數據信息,指針域next指向依附于頂點vertex的第一條邊。

vertexnext

每一個鏈表中,鏈表的每一個結點陳偉邊結點,表示依附于對應頂點的一條邊。adjvex域存放該邊的另一端頂點在頂點數組中的位置(數組下標);weight存放邊的權重;next指向下一條邊結點,若是最后一個邊結點,則指向NULL;

adjvexweightnext
																			分別對應了頭結點以及邊結點:
有向圖
有向圖的鄰接表

3、代碼定義鄰接表

//鄰接表定義
#define MAX_VERTEX_NUM 20		//指定圖中頂點最大的個數為20
typedef struct ArcNode
{//單鏈表中結點類型int adjvex;					//該邊指向頂點在順序表中的位置(數組下標)struct ArcNode *next;		//指向下一條邊的指針infoType *weight;			//邊上的權重
}ArcNode;typedef struct VNode
{//頂點類型VertexType data;			//頂點中的數據信息,為VertexType類型ArcNode *firstarc;			//指向單鏈表,即指向一條邊
}VNode;VNode G[MAX_VERTEX_NUM];		//VNode類型的數組G,它是圖中頂點的存儲容器。

3、圖的創建

圖的創建就是創建一個基于鄰接表存儲的圖結構。在此之前,必須先設計好圖的邏輯結構。
步驟:
1、創建圖的頂點,也就是創建存儲圖中頂點的順序表
2、創建頂點之間的邊,也就是創建單鏈表。
代碼描述如下:
1、首先向頂點中賦值。通過Getdata得到每個頂點中的數據,并將它賦值到G[i].data中去。
每個頂點的firstarc域要初始化為NULL
2、然后創建頂點之間的邊。創建時應該嚴格按照最開始所設計的圖的邏輯結構進行邊的輸入。
創建邊的過程與創建鏈表的過程類似。
當輸入-1時,表示該頂點依附的邊創建完成

//圖的創建
GreatGraph(int n,VNode G[])
{int i,e;ArcNode *p,*q;printf("輸入頂點信息\n");for(i=0;i<n;i++){					Getdata(G[i]);			//得到每條頂點中的數據	G[i].firstarc=NULL;		//初始化每一個頂點第一條邊為空}for(i=0;i<n;i++){printf("創建第%d個頂點的邊");scanf("%d",&e);			//輸入邊指向的頂點坐標while(e!=-1){p=(ArcNode *)malloc(sizeof(ArcNode));		//創建一條邊p->next =NULL;		//鏈表結點next指向空p->adjvex = e;		//將該邊指向頂點的信息賦值給adjvexif(G[i].firstarc == NULL)G[i].firstarc=p;	//i結點的第一條邊else q->next = p;q=p;scanf("%d",&e);}}
}//如果是創建上面提到過的有向圖,則:
void main()
{VNode G[3];CreatGpraph(3,G);
}

4、深度優先搜索DFS

圖的遍歷:從圖的某一頂點出發,訪遍圖中其余頂點,且使每個頂點只被訪問一次。
圖的遍歷可用于 求解圖的連通性問題,拓撲排序,求解最短路徑,求解關鍵路徑

深度優先搜索的基本思路:
從圖中的某個頂點v出發,訪問該頂點v,然后再一次從v的未被訪問過的鄰接點出發,繼續優先深度優先遍歷該圖,直到圖中與頂點v路徑相通的頂點都被訪問到為止。
由于一個圖結構未必是連通的,因此一次的深度優先搜索不一定可以遍歷到圖中所有的頂點,若此時圖中仍然有頂點未被訪問,
就另選圖中的一個沒有被訪問到的頂點作為起始點,繼續深度優先搜索。
重復上述操作,直到圖中所有頂點都被訪問到為止。
深度優先搜索是一個遞歸操作,重復“訪問頂點v,再依次從v未被訪問過的鄰接點出發繼續深度優先搜索”

//代碼描述
/*
深度優先搜索一個連通圖
*/
void DFS(VNode G[],int v)
{int w;visit(v);				//訪問當前頂點visited[v] =1;			//將頂點v對應的訪問標記置1w=FirstAdj(G,v);		//找到頂點v的第一個鄰接點,如果無鄰接點返回-1while(w!=-1){if(visited[w]==0)	//如果該頂點未被訪問{DFS(G,w);		//遞歸地進行深度優先訪問w=NextAdj(G,v); //找到頂點v的下一個鄰接點,如果沒有返回-1}}
}//對圖中G=(V,E)進行深度優先搜索的主算法
void Travel_DFS(VNode G[],int visited[],int n)
{int i;for(i=0;i<n;i++)visited[i]=0;		//將標記數組初始化為0for(i=0;i<n;i++)if(visited[i]==0)  	//若有頂點未被訪問,從該頂點開始繼續深度優先搜索DFS(G,i);
}

Travel_DFS 函數包含了3個參數
G[]表示存儲圖結構的容器,這里可以理解為鄰接表
visited[]為設置的方位標志數組,用來標記圖中被訪問過的頂點
n表示圖中的頂點個數。
將visited初始化為0,因為一開始時,圖中的任何定點都沒有被訪問。
然后從第一個沒有被訪問的頂點開始調用遞歸函數DFS,從該頂點開始深度優先遍歷整個圖
之所以不能僅僅通過一個遞歸函數DFS()來遍歷整個圖,是因為DFS只能遍歷到從起始頂點v開始所有與v相連通的圖的頂點。
如果這個圖不是連通的,僅僅通過DFS是無法遍歷完全的

可以舉個例子來描述詳細遍歷過程:
在這里插入圖片描述

假設以V0為起點,訪問標志數組初始值為visited[5]={0,0,0,0,0};
{(1)訪問頂點V0,visited[5]=1,0,0,0,0(2)用函數FirstAdj得到V0第一個鄰接點,如V1(3)如果不返回-1,即有鄰接點(3.1)訪問頂點V1,visited[5]=1,1,0,0,0(3.2)用函數FirstAdj得到V1第一個鄰接點,V2(因為V0已經訪問過了)(3.3)如果不返回-1,即有鄰接點(3.3.1)訪問頂點V2,visited[5]=1,1,1,0,0(3.3.2)用函數FirstAdj得到V2第一個鄰接點,返回-1,因為都被訪問過了(3.4)用函數NextAdj()得到V1下一個鄰接點返回-1,因為都被訪問過兒(4)用函數NextAdj()得到V0下一個鄰接點返回-1,因為都被訪問過兒\begin{cases} (1)& \text{訪問頂點V0,visited[5]={1,0,0,0,0}}\\ (2)& \text{用函數FirstAdj得到V0第一個鄰接點,如V1}\\ (3)& \text{如果不返回-1,即有鄰接點}\\ (3.1)& \text{訪問頂點V1,visited[5]={1,1,0,0,0}}\\ (3.2)& \text{用函數FirstAdj得到V1第一個鄰接點,V2(因為V0已經訪問過了)}\\ (3.3)& \text{如果不返回-1,即有鄰接點}\\ (3.3.1)& \text{訪問頂點V2,visited[5]={1,1,1,0,0}}\\ (3.3.2)& \text{用函數FirstAdj得到V2第一個鄰接點,返回-1,因為都被訪問過了}\\ (3.4)& \text{用函數NextAdj()得到V1下一個鄰接點返回-1,因為都被訪問過兒}\\ (4)& \text{用函數NextAdj()得到V0下一個鄰接點返回-1,因為都被訪問過兒}\\ \end{cases}????????????????????????????????????????(1)(2)(3)(3.1)(3.2)(3.3)(3.3.1)(3.3.2)(3.4)(4)?訪問頂點V0visited[5]=1,0,0,0,0用函數FirstAdj得到V0第一個鄰接點,如V1如果不返回-1,即有鄰接點訪問頂點V1visited[5]=1,1,0,0,0用函數FirstAdj得到V1第一個鄰接點,V2(因為V0已經訪問過了)如果不返回-1,即有鄰接點訪問頂點V2visited[5]=1,1,1,0,0用函數FirstAdj得到V2第一個鄰接點,返回-1,因為都被訪問過了用函數NextAdj()得到V1下一個鄰接點返回-1,因為都被訪問過兒用函數NextAdj()得到V0下一個鄰接點返回-1,因為都被訪問過兒?

5、廣度優先搜索BFS

廣度優先搜索基本思路:
從圖中的指定頂點v出發,先訪問頂點v,然后依次訪問v的各個未被訪問的鄰接點,然后從這些鄰接點出發,按照同樣的原則依次訪問它們未被訪問的鄰接點
如此循環,直道圖中所有與v相連通的鄰接點都被訪問。
若此時圖中仍有頂點未被訪問,就另選圖中的一個沒有被訪問到的頂點作為起始點,繼續廣度優先搜索,直道圖中所有頂點都訪問完為止。

深度優先特點:從一個頂點深入下去,深入到不能再深入下去為止,再從另一個未被訪問過的頂點深入下去。
廣度優先特點:按層次遍歷的方法,即先訪問離頂點v0最近的頂點v1,v2,v3,…再逐一訪問離v1 v2 v3 …最近的頂點

算法思路:

【A】
1、訪問頂點v
2、每訪問到一個頂點。都將對應的訪問標簽置1
3、將一杯訪問過的頂點v入隊列
【B】
循環執行以下操作:
1、從隊列中取出隊頭元素(頂點v)
2、得到該頂點的第一個鄰接點
3、如果該鄰接點還沒被訪問、則訪問,并入隊列,訪問標記置1
4、求頂點v的下一個鄰接點,如果存在鄰接點,則跳回步驟3,如果不存在鄰接點,跳回到步驟1
循環執行上述操作,直到隊列取空為止。
一旦隊列取空則表明最后訪問到的頂點已經沒有未訪問到的鄰接點了

代碼描述:

void BFS(VNode G[],int v)
{int w;visit(v);				//訪問頂點vvisited[v]=1;			//將頂點v對應的訪問標記置1EnQueue(q,v);			//頂點v入隊列while(!emptyQ(q)){DeQueue(&q,&v);		//出隊列,元素由v返回w = FirstAdj(G,v);	//找到頂點v的第一個鄰接點,如果無鄰接點返回-1while(w!=-1){if(visited[w]==0){visit(w);EnQueue(q,w);	//頂點w入隊列visited[w]=1;}w=NextAdj(G,v);		//找到頂點v的下一個鄰接點,如果無鄰接點,返回-1}}
}//對圖G=(V,E)進行廣度優先搜索的主要算法
void Travel_BFS(VNode G[],int visited[],int n)
{int i;for(i=0;i<n;i++){visited[0]=0;			//標記數組初始化為0}for(i=0;i<n;i++){if(visited[i]==0)		//如果頂點未被訪問到,從該頂點開始繼續廣度優先搜索BFS(G,i);}
}
/*
BFS實現廣度優先搜索一個連通的圖,參數G[]表示圖的存儲容器,即鄰接表
v表示廣度優先遍歷訪問起點

可以舉個例子來描述詳細遍歷過程:
在這里插入圖片描述

1、visit(V0),visited[5]={1,0,0,0,0} queue: V0
2、QueOut(V0),Firstadj(V0)=V1,visit(V1) queue:
3、visit(V1),visited[5]={1,1,0,0,0} queue: V1
4、NextAdj(V0)=V2,visit(V2) queue: V1
5、visit(V2),visited[5]={1,1,1,0,0} queue: V1,V2
6、NextAdj(V0)=-1 queue: V1,V2
7、QueOut(V1),Firstadj(V1)=V3,visit(V3) queue: V2
8、visit(V3),visited[5]={1,1,1,1,0} queue: V2,V3
9、NextAdj(V1)=V4,visit(V4) queue: V2,V3
10、visit(V4),visited[5]={1,1,1,1,1} queue: V2,V3,V4
11、NextAdj(V1)=-1 queue: V2,V3,V4
12、QueOut(V2),Firstadj(V2)=-1 queue: V3,V4
14、QueOut(V3),Firstadj(V3)=-1 queue:V4
15、QueOut(V4),Firstadj(V4)=-1 queue:
此數據結構為二叉樹結構,所以廣度優先搜索適用于對樹結構的遍歷,因為樹結構是標準的層次結構

注意,我們這里的遍歷是按照圖中每個頂點之間的關系對一個圖的各連通分量進行的遍歷,而不只是對圖中的每個頂點進行訪問那么簡單。圖的遍歷可能帶有其他操作如:計算帶權有向圖邊權之和,記錄有向圖頂點訪問軌跡,記錄兩頂點之間的邊權值問題,都必須依賴圖的遍歷。

6、實例分析

這里實例化上面涉及到的兩個函數FirstAdj()和NextAdj();
FirstAdj():
功能:返回頂點的第一個鄰接點在數組G的下標,如果該頂點無鄰接點,返回-1

//返回第一個鄰接點在數組中的下標
int FirstAdj(VNode G[],int v)
{if(G[v].firstarc!=NULL) return (G[v].firstarc)->adjvex;	//如過該結點有第一條邊,返回下標,否則返回-1return -1;
}

NextAdj():
功能:返回頂點的下一個鄰接點在數組G的下標,如果該頂點無鄰接點,或者該點所有鄰接點都被訪問過,返回-1

//返回下一個鄰接點在數組中的下標
int NextAdj(VNode G[],int v)
{ArcNode *p;p=G[v].firstarc;while(p!=NULL){if(visited[p->adjvex]) p=p->next;		//如果已經訪問過,返回-1else return p->adjvex;}return -1;
}

用鄰接表存儲的形式創建一棵無向圖,并應用深度優先搜索方法遍歷該圖中的每個頂點
在這里插入圖片描述

#include <stdio.h>
#include <stdlib.h>
#include "malloc.h"
#include "conio.h"//鄰接表定義
#define MAX_VERTEX_NUM 20		//指定圖中頂點最大的個數為20
typedef int VertexType ;
typedef struct ArcNode
{//單鏈表中結點類型int adjvex;					//該邊指向頂點在順序表中的位置(數組下標)struct ArcNode* next;		//指向下一條邊的指針//infoType* weight;			//邊上的權重
}ArcNode;typedef struct VNode
{//頂點類型VertexType data;			//頂點中的數據信息,為VertexType類型ArcNode* firstarc;			//指向單鏈表,即指向一條邊
}VNode;VNode G[MAX_VERTEX_NUM];		//VNode類型的數組G,它是圖中頂點的存儲容器。
int visited[5] = { 0,0,0,0,0 };//圖的創建
void GreatGraph(int n, VNode G[])
{int i, e;ArcNode* p, * q;q = NULL;printf("輸入頂點信息\n");for (i = 0;i < n;i++){scanf("%d", &G[i].data);			//得到每條頂點中的數據	G[i].firstarc = NULL;		//初始化每一個頂點第一條邊為空}for (i = 0;i < n;i++){printf("創建第%d個頂點的邊\n",i);scanf("%d", &e);			//輸入邊指向的頂點坐標while (e != -1){p = (ArcNode*)malloc(sizeof(ArcNode));		//創建一條邊p->next = NULL;		//鏈表結點next指向空p->adjvex = e;		//將該邊指向頂點的信息賦值給adjvexif (G[i].firstarc == NULL)G[i].firstarc = p;	//i結點的第一條邊else{q->next = p;}q = p;scanf("%d", &e);}}
}
//返回第一個鄰接點在數組中的下標
int FirstAdj(VNode G[], int v)
{if (G[v].firstarc != NULL) return (G[v].firstarc)->adjvex;	//如過該結點有第一條邊,返回下標,否則返回-1return -1;
}//返回下一個鄰接點在數組中的下標
int NextAdj(VNode G[], int v)
{ArcNode* p;p = G[v].firstarc;while (p != NULL){if (visited[p->adjvex]) p = p->next;		//如果已經訪問過,返回-1else return p->adjvex;}return -1;
}void DFS(VNode G[], int v)
{int w;printf("%d ", G[v].data);		//訪問當前頂點,打印出頂點額數據信息visited[v] = 1;			//將頂點v對應的訪問標記置1w = FirstAdj(G, v);		//找到頂點v的第一個鄰接點,如果無鄰接點返回-1while (w != -1){if (visited[w] == 0)	//如果該頂點未被訪問{DFS(G, w);		//遞歸地進行深度優先訪問}w = NextAdj(G, v); //找到頂點v的下一個鄰接點,如果沒有返回-1}
}/*
1、首先向頂點中賦值。通過Getdata得到每個頂點中的數據,并將它賦值到G[i].data中去。
每個頂點的firstarc域要初始化為NULL
2、然后創建頂點之間的邊。創建時應該嚴格按照最開始所設計的圖的邏輯結構進行邊的輸入。
創建邊的過程與創建鏈表的過程類似。
當輸入-1時,表示該頂點依附的邊創建完成
*/
int main()
{VNode G[5];GreatGraph(5, G);printf("DFS搜索\n ");DFS(G, 0);_getche();return 0;
}

效果:
在這里插入圖片描述

放幾個鏈接,學習學習

https://blog.csdn.net/ledou2/article/details/81875743
https://blog.csdn.net/ledou2/article/details/81905831

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378264.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378264.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378264.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第十六章 測試基礎

第十六章 測試基礎 在編譯型語言中&#xff0c;需要不斷重復編輯、編譯、運行的循環。 在Python中&#xff0c;不存在編譯階段&#xff0c;只有編輯和運行階段。測試就是運行程序。 先測試再編碼 極限編程先鋒引入了“測試一點點&#xff0c;再編寫一點點代碼”的理念。 換而…

如何蹭網

引言蹭網&#xff0c;在普通人的眼里&#xff0c;是一種很高深的技術活&#xff0c;總覺得肯定很難&#xff0c;肯定很難搞。還沒開始學&#xff0c;就已經敗給了自己的心里&#xff0c;其實&#xff0c;蹭網太過于簡單。我可以毫不夸張的說&#xff0c;只要你會windows的基本操…

android對象緩存,Android簡單實現 緩存數據

前言1、每一種要緩存的數據都是有對應的versionCode&#xff0c;通過versionCode請求網絡獲取是否需要更新2、提前將要緩存的數據放入assets文件夾中&#xff0c;打包上線。緩存設計代碼實現/*** Created by huangbo on 2017/6/19.** 主要是緩存的工具類** 緩存設計&#xff1a…

通信原理.緒論

今天剛上通信原理的第一節課&#xff0c;沒有涉及過多的講解&#xff0c;只是講了下大概的知識框架。現記錄如下&#xff1a; 目錄1、基本概念消息、信息與信號2、通信系統模型1、信息源2、發送設備3、信道4、接收設備5、信宿6、模擬通信系統模型7、數字通信系統模型8、信源編…

Android版本演進中的兼容性問題

原文&#xff1a;http://android.eoe.cn/topic/summary Android 3.0 的主要變化包括: 不再使用硬件按鍵進行導航 (返回、菜單、搜索和主屏幕)&#xff0c;而是采用虛擬按鍵 (返回&#xff0c;主屏幕和最近的應用)。在操作欄固定菜單。 Android 4.0 則把這些變化帶到了手機平臺。…

css rgba透明_rgba()函數以及CSS中的示例

css rgba透明Introduction: 介紹&#xff1a; Functions are used regularly while we are developing a web page or website. Therefore, to be a good developer you need to master as many functions as you can. This way your coding knowledge will increase as well …

第十七章 擴展Python

第十七章 Python什么都能做&#xff0c;真的是這樣。這門語言功能強大&#xff0c;但有時候速度有點慢。 魚和熊掌兼得 本章討論確實需要進一步提升速度的情形。在這種情況下&#xff0c;最佳的解決方案可能不是完全轉向C語言&#xff08;或其他中低級語言&#xff09;&…

android studio資源二進制,無法自動檢測ADB二進制文件 – Android Studio

我嘗試在Android Studio上測試我的應用程序,但我遇到了困難"waiting for AVD to come online..."我讀過Android設備監視器重置adb會做到這一點,它確實……對于1次測試,當我第二天重新啟動電腦時,我不僅僅是&#xff1a;"waiting for AVD to come online..."…

犀牛腳本:仿迅雷的增強批量下載

迅雷的批量下載滿好用。但是有兩點我不太中意。在這個腳本里會有所增強 1、不能設置保存的文件名。2、不能單獨設置這批下載的線程限制。 使用方法 // 下載從編號001到編號020的圖片&#xff0c;保存名為貓咪寫真*.jpg 使用6個線程 jdlp http://bizhi.zhuoku.com/bizhi/200804/…

為什么使用1 * 1 的卷積核

為什么使用 1* 1卷積核&#xff1f; 作用&#xff1a; 1、實現跨通道的交互和信息整合 2、 進行卷積核通道數的降維和升維 3、 在保持feature map尺度不變的&#xff08;即不損失分辨率&#xff09;的前提下大幅增加非線性特性 跨通道的交互和信息整合 使用1 * 1卷積核&a…

KingPaper初探ThinkPHP3.1.2之擴展函數庫和類庫的使用(四)

在我們做項目的時候TP的系統函數或系統類庫滿足不了我們的需要 所以有些東西需要我們自己去定義&#xff0c;在TP中我們怎么使用自己的函數庫和類庫呢&#xff1f;在TP系統中提供了三個系統函數庫 common.php是全局必須加載的基礎函數庫&#xff0c;在任何時候都可以直接調用&a…

isfinite函數_isfinite()函數以及C ++中的示例

isfinite函數C isfinite()函數 (C isfinite() function) isfinite() function is a library function of cmath header, it is used to check whether the given value is a finite value or not? It accepts a value (float, double or long double) and returns 1 if the v…

android 服務端 漏洞,安卓漏洞 CVE 2017-13287 復現詳解-

2018年4月&#xff0c;Android安全公告公布了CVE-2017-13287漏洞。與同期披露的其他漏洞一起&#xff0c;同屬于框架中Parcelable對象的寫入(序列化)與讀出(反序列化)的不一致所造成的漏洞。在剛看到谷歌對于漏洞給出的補丁時一頭霧水&#xff0c;在這里要感謝heeeeenMS509Team…

某公司面試題

一、基礎題 1&#xff0c;馮諾依曼結構的計算機硬件邏輯組成中&#xff0c;不包含以下哪個模塊&#xff1f; A&#xff0c;編譯器 B&#xff0c;控制器 C&#xff0c;輸入設備 D&#xff0c;輸出設備 解釋&#xff1a;馮諾依曼由五個模塊組成&#xff1a;輸入設備 輸出設備 存…

GAP(全局平均池化層)操作

轉載的文章鏈接&#xff1a; 為什么使用全局平均池化層&#xff1f; 關于 global average pooling https://blog.csdn.net/qq_23304241/article/details/80292859 在卷積神經網絡的初期&#xff0c;卷積層通過池化層&#xff08;一般是 最大池化&#xff09;后總是要一個或n個全…

zoj1245 Triangles(DP)

/* 動態三角形&#xff1a;每次DP時考慮的是兩個子三角形的高度即可 注意&#xff1a; 三角形可以是倒置的。 */ View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <stdio.h> 5 6 using namespace std; 7 8…

第十八章 程序打包

第十八章 程序打包 Setuptools和較舊的Distutils都是用于發布Python包的工具包&#xff0c;能夠使用Python輕松地編寫安裝腳本。這些腳本可用于生成可發布的歸檔文檔&#xff0c;供用戶用來編譯和安裝編寫庫。 Setuptools并非只能用于創建基于腳本的Python安裝程序&#xff0…

如何在Java中檢查對象是否為空?

With the help of "" operator is useful for reference comparison and it compares two objects. 借助“ ”運算符&#xff0c;對于參考比較非常有用&#xff0c;它可以比較兩個對象。 "" operator returns true if both references (objects) points to…

android編程從零開始,從零開始學習android開發

博主最近開通了Android欄目&#xff0c;現在正在從零開始學習android&#xff0c;遇到的所有值得分享的知識點以及遇到的問題將發布在這個博客的android欄目下。因為我有著深厚的java底子&#xff0c;所以學習起來得心應手&#xff0c;十分的簡單&#xff0c;當然也只能算是入門…

CNN基本步驟以及經典卷積(LeNet、AlexNet、VGGNet、InceptionNet 和 ResNet)網絡講解以及tensorflow代碼實現

課程來源&#xff1a;人工智能實踐:Tensorflow筆記2 文章目錄前言1、卷積神經網絡的基本步驟1、卷積神經網絡計算convolution2、感受野以及卷積核的選取3、全零填充Padding4、tf描述卷積層5、批標準化(BN操作)6、池化Pooling7、舍棄Dropout8、卷積神經網絡搭建以及參數分析2、經…