图的基本概念、存储及基本操作(邻接矩阵法与邻接表法)

2023-05-16

图的基本概念、存储及基本操作(邻接矩阵法与邻接表法)

1. 图的基本概念

1.1 图的定义

图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G (V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。

在这里插入图片描述

图的定义与线性表定义的对比:

  • 线性表中我们把数据元素叫元素,树中将数据元素叫结点,在图中数据元素,我们则称之为顶点(Vertex)。
  • 线性表中可以没有数据元素,称为空表。树中可以没有结点,叫做空树。但是在图结构中,不允许没有顶点。在定义中,若V是顶点的集合,则强调了顶点集合V有穷非空。
  • 线性表中,相邻的数据元素之间具有线性关系,树结构中,相邻两层的结点具有层次关系,而图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的。

1.2 图的分类

1.2.1 无向图

无向边: 若顶点vi到vj之间的边没有方向,则称这条边为无向边(Edge),用无序偶对(vi,vj)来表示。

**若E是无向边(简称边)的优先集合时,则图G为无向图。**如下图所示:

在这里插入图片描述

  • G=(V,E)
  • V = {V1,V2,V3,V4,V5,V6}
  • E = {<V1,V2>,<V1,V4>,<V2,V5>,<V1,V3>,<V3,V4>,<V3,V5>,<V3,V6>,<V4,V6>,<V5,V6>}

1.2.2 有向图

有向边: 若从顶点vi到vj的边有方向,则称这条边为有向边,也称为弧(Arc)。用有序偶来表示,vi称为弧尾(Tail),vj称为弧头(Head)。

若E是有向边(也称弧)的有限集合时,则G为有向图。如下图所示:

See the source image
  • G=(V,E)
  • V = {1, 2, 3, 4, 5}
  • E = {<1,3>,<1,2>,<2,3>,<2,4>,❤️,5>,<4,3>,<4,5>}

1.2.3 简单图

在图中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图。满足以下两个条件

  1. 无重复边
  2. 不存在结点到自身的边

1.2.4 多重图

若图G中某两个顶点之间的边数大于1条,又允许顶点通过一条边和自身关联,则称图为多重图。

1.2.5 完全图

完全图又分无向完全图与有向完全图。

无向完全图: 在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。

含有n个顶点的无向完全图有n(n-1)/2条边。

有向完全图: 在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。

含有n个顶点的有向完全图有n×(n-1)条边。

对于具有n个顶点和e条边数的图,无向图 0 ≤ e ≤ n ( n − 1 ) / 2 0≤e≤n(n-1)/2 0en(n1)/2, 有向图 0 ≤ e ≤ n ( n − 1 ) 0≤e≤n(n-1) 0en(n1)

稀疏图与稠密图: 有很少条边或弧的图称为稀疏图,反之称为稠密图。这里稀疏和稠密是模糊的概念,都是相对而言的。
: 有些图的边或弧具有与它相关的数字,这种与图的边或弧相关的数叫做权(Weight)。这些权可以表示从一个顶点到另一个顶点的距离或耗费。
: 带权的图通常称为网(Network)。
子图: 设有两个图G=(V,{E})和G’=(V’,{E’}),如果$V’∈V且E’∈E,则称G’为G的子图(Sub-graph)。

1.3. 概念

1.3.1 图的顶点与边间关系

邻接点: 对于无向图G=(V,{E}),如果边(v,v’)∈E,则称顶点v和v’互为邻接点(Adjacent),即v和v’相邻接。

边(v,v’)依附(incident)于顶点v和v’,或者说(v,v’)与顶点v和v’相关联

: 顶点v的度(Degree)是和v相关联的边的数目,记为TD(v)。

对于有向图G=(V,{E}),如果弧∈E,则称顶点v邻接到顶点v’,顶点v’邻接自顶点v。弧和顶点v,v’相关联。以顶点v为
头弧的数目称为v的入度(InDegree),记为ID(v);以v为尾的弧的数目称为v的出度(OutDegree),记为OD(v);顶点v的度为TD(v)=ID(v)+OD(v)。

路径: 无向图G=(V,{E})中从顶点v到顶点v’的路径(Path)是一个顶点序列 ( v = v i 0 , v i 1 , . . . , v i m = v ′ ) , 其 中 ( v i , j − 1 , v i , j ) ∈ E , 1 ≤ j ≤ m (v=v_{i0},v_{i1},...,v_{im}=v'),其中(v_{i,j-1},v_{i,j})∈E,1≤j≤m (v=vi0,vi1,...,vim=v)(vi,j1,vi,j)E1jm,其中,。如果G是有向图,则路径也是有向的,顶点序列应满足 < v i , j − 1 , v i , j > ∈ E , 1 ≤ j ≤ m 。 <v_{i,j-1},v_{i,j}>∈E,1≤j≤m。 <vi,j1,vi,j>E1jm

路径的长度是路径上的边或弧的数目。

回路: 第一个顶点和最后一个顶点相同的路径称为回路或环(Cycle)。
简单路径: 序列中顶点不重复出现的路径称为简单路径。
简单回路: 除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环。

1.3.2 连通图相关术语

连通: 在无向图G中,如果从顶点v到顶点v’有路径,则称v和v’是连通的。
连通图: 如果对于图中任意两个顶点vi、vj∈V,vi和vj都是连通的,则称G是连通图(Connected Graph)。
连通分量: 无向图中的极大连通子图称为连通分量。连通分量的概念强调:

  • 要是子图;
  • 子图要是连通的;
  • 连通子图含有极大顶点数;
  • 具有极大顶点数的连通子图包含依附于这些顶点的所有边。

强连通:在有向图中,如果有一对顶点v和w,从v到w和从w到v之间都有路径,则称这两个顶点是强连通的。

强连通图: 在有向图G中,如果对于每一对vi、vj∈V、vi≠vj,从vi到vj和从vj到vi都存在路径,即图中任何一对顶点都是强连通的,则称G是强连通图。
强连通分量: 有向图中的极大强连通子图称做有向图的强连通分量。
如下图,图1不是强连通图,因为顶点A到顶点D存在路径,而D到A就不存在,但图2是强连通图,图2是图1的极大强连通子图即强连通分量。

在这里插入图片描述

连通图的生成树: 所谓的一个连通图的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边。

如下图所示:图G1即为图G的最小生成树。

image-20210930204254925

.

如果一个图有n个顶点和小于n-1条边,则是非连通图,如果它多于n-1条边,必定构成一个环,因为这条边使得它依附的那两个顶点之间有了第二条路径。随便加哪两顶点的边都将构成环。不过有n-1条边并不一定是生成树。

有向树: 如果一个有向图恰有一个顶点的入度为0,其余顶点的入度均为1,则是一个有向树。

对有向树的理解比较容易,所谓入度为0其实就相当于树中的根结点,其余顶点入度为1就是说树的非根结点的双亲只有一个。

有向图的生成森林: 一个有向图的生成森林由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧。

2. 图的存储与基本操作

图的存储必须要完整、准确地反映顶点集与边集的信息。

2.1 邻接矩阵存储

定义:

用一个有一位数组存储图中顶点得信息,用一个二维数组存储图中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二维数组称为邻接矩阵。

图解:

邻接矩阵表示有向图如下图所示:

邻接矩阵表示无向图如下图所示:

See the source image

邻接矩阵表示网如下图所示:

See the source image

特点

  • 图的邻接矩阵是唯一的,适于存储边的数目较多的稠密图。
  • 无向图的邻接矩阵一定是一个对称矩阵,可采用压缩存储的思想,只存储上(下)三角形阵的元素即可。
  • 不带权的有向图的邻接矩阵一般是一个稀疏矩阵。
  • 矩阵中第 i 行或 第 i 列有效元素个数之和就是顶点的度。
  • 在有向图中 第 i 行有效元素个数之和是顶点的出度,第 i 列有效元素个数之和是顶点的入度。

邻接矩阵代码存储:

typedef int InfoType;
#define	MAXV 100				//最大顶点个数
#define INF 32767				//INF表示∞
//以下定义邻接矩阵类型
typedef struct 
{  	int no;						//顶点编号
	InfoType info;				//顶点其他信息
} VertexType;					//顶点类型
typedef struct  				//图的定义
{  	int edges[MAXV][MAXV]; 		//邻接矩阵
   	int n,e;   					//顶点数,边数
	VertexType vexs[MAXV];		//存放顶点信息
} MGraph;	

2.2 邻接表存储

定义:

图的邻接表存储方式是一种按顺序分配与链式分配相结合的存储方法.
为每个顶点建立一个单链表,边结点由三个域组成,adjvex指示与顶点i邻接的顶点的编号,nextarc指向对应下一条边的节点,info存储与边相关的信息,如权值等。表头节点有两个域组成,data存储顶点i对应的名称或其他信息,firstarc指向对应顶点i的链表中的第一个边节点。

图解

表示有向图的邻接表与逆邻接表如下图所示:

See the source image 表示无向图的邻接表如下图所示: See the source image

特点

  1. 顶点 vi 的出度为第i个单链表中的结点个数。
  2. 顶点 vi 的入度为整个单链表中邻接点域值是i-1的结点个数。
  3. 找出度易,找入度难

邻接表代码存储:

//以下定义邻接表类型
typedef struct ANode           	//边的节点结构类型
{	int adjvex;              	//该边的终点位置
   	struct ANode *nextarc; 		//指向下一条边的指针
   	InfoType info;           	//该边的相关信息,这里用于存放权值
} ArcNode;
typedef int Vertex;
typedef struct Vnode      		//邻接表头节点的类型
{	Vertex data;            	//顶点信息
    ArcNode *firstarc;     		//指向第一条边
} VNode;
typedef VNode AdjList[MAXV];	//AdjList是邻接表类型
typedef struct 
{	AdjList adjlist;         	//邻接表
    int n,e;                 	//图中顶点数n和边数e
} ALGraph;                   	//图的邻接表类型

2.3 邻接矩阵与邻接表优缺点:

邻接矩阵的优缺点

  • 优点:
    • 可以快速判断两个顶点之间是否存在边
    • 可以快速添加边或者删除边。
  • 缺点:
    • 是如果顶点之间的边比较少,会比较浪费空间。因为是一个 n∗nn∗n 的矩阵。

邻接表的优缺点:

  • 优点:
    • 方便找任一顶点的所有“邻接点”
    • 节约稀疏图的空间:需要N个头指针+2E个结点(每个结点至少2个域)
    • 对无向图而言,方便计算任一顶点的度
  • 缺点:
    • 对有向图而言,只能计算“出度”,需要构造“逆邻接表”来方便计算“入度”。

2.4. 图的基本操作

图的基本操作与实现

(1)自选存储结构,输入含n个顶点(用字符表示顶点)和e条边的图G;

(2)求每个顶点的度,输出结果;

(3) 指定任意顶点x为初始顶点,对图G作DFS遍历,输出DFS顶点序列(提示:使用一个栈实现DFS);

(4) 指定任意顶点x为初始顶点,对图G作BFS遍历,输出BFS顶点序列(提示:使用一个队列实现BFS);

(5) 输入顶点x,查找图G:若存在含x的顶点,则删除该结点及与之相关连的边,并作DFS遍历(执行操作3);否则输出信息“无x”;

(6)判断图G是否是连通图,输出信息“YES”/“NO”;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define maxSize 100
using namespace std;
 
int Count=0;
const int Max=50;
typedef char type;
bool visited[100] = { false };
 
typedef struct                         ///定义数据结构:栈
{
    int *top;
    int *base;
    int Size;
}Stack;
 
typedef struct                        ///定义数据结构:队列
{
    int *Front;
    int *Rear;
    int Size;
} Queue;
 
typedef struct                       ///定义数据结构:图
{
    type vexs[Max];
    bool arcs[Max][Max];
    int vexnum,arcnum;
} graph;
 
void InitStack(Stack &s)             ///对栈进行初始化
{
    if(!(s.top=s.base=(int *)malloc(maxSize*sizeof(int))))
        return ;
    s.Size=maxSize;
}
 
void push(Stack &s,int e)            ///入栈:将元素e压入栈
{
    *s.top=e;
    s.top++;
}
 
void pop(Stack &s)                  ///出栈:栈顶指针减一
{
    if(s.base==s.top)
        return ;
    s.top--;
}
 
int top(Stack s)                    ///返回栈顶元素
{
    s.top--;
    return *s.top;
}
 
void InitQueue(Queue &q)            ///初始化队列
{
    if(!(q.Front=q.Rear=(int *)malloc(maxSize*sizeof(int))))
        return ;
    q.Size=maxSize;
}
 
void Q_push(Queue &q,int e)         ///入队列:将元素e入队列
{
    *q.Rear=e;
    q.Rear++;
}
 
int Q_pop(Queue &q)                 ///出队列:返回队头元素,队头指针加一
{
    int e;
    if(q.Front==q.Rear)
        return 0;
    e=*q.Front;
    q.Front++;
    return e;
}
 
void Create(graph *g)               ///建立邻接矩阵并输出
{
    int i,j;
    memset(g->arcs,0,sizeof(g->arcs));
    for(i=0; i<g->arcnum; ++i)
    {
        int x,y;
        cin>>x>>y;
        g->arcs[x][y]=1;
        g->arcs[y][x]=1;
    }
    cout<<"无向邻接表矩阵为:"<<endl;
    for(i=0; i<g->vexnum; i++)
    {
        for(j=0; j<g->vexnum; j++)
            cout<<g->arcs[i][j]<<" ";
        cout<<endl;
    }
}
 
void Du(graph *g)                    ///统计每个顶点的度
{
    int i,j;
    for(i=0; i<g->vexnum; i++)
    {
        int amount=0;
        for(j=0; j<g->vexnum; ++j)
            if(g->arcs[i][j])
                ++amount;
        cout<<"顶点"<<g->vexs[i]<<"的度为"<<amount<<endl;
    }
}
 
void DFS(graph *g,int k)            ///DFS深度优先搜索
{
    int t,i;
    Stack s;
    InitStack(s);
    cout<<g->vexs[k]<<" ";
    visited[k]=true;
    push(s,k);
    while(s.base!=s.top)
    {
        t=top(s);
        if(i==g->vexnum)                              ///如果內层循环未找到没被访问的元素,则出栈
            pop(s);
        for(i=0; i<g->vexnum; i++)
        {
            if(g->arcs[t][i]==1&&visited[i]==false)   ///找出邻接矩阵第t+1行中第一个未被访问的元素
            {
                visited[i]=true;                      ///找到后标志为1,并输出,入栈
                cout<<g->vexs[i]<<" ";
                push(s,i);
                break;                                ///找到之后跳出內层循环,返回外层循环起始处,重复之前操作
            }
        }
    }
}
 
void BFS(graph *g, int k)            ///BFS广度优先搜索
{
    Queue q;
    InitQueue(q);
    visited[k]=true;
    cout<<g->vexs[k]<<" ";
    Q_push(q,k);
    while(q.Front!=q.Rear)
    {
        int t=Q_pop(q);
        for(int w=0; w<g->vexnum; w++)
        {
            if (g->arcs[t][w]!=0&&visited[w]==false)   ///找出邻接矩阵中t+1行所有未被访问的元素
            {
                visited[w]=true;                       ///每找到一个标志为1并入队列
                cout<<g->vexs[w]<<" ";
                Q_push(q,w);
            }
        }
    }
}
 
void Is_in_graph(graph *g,char ch)      ///查询图中是否存在顶点ch
{
    int i,j,k;
    for(i=0; i<g->vexnum; i++)          ///遍历顶点数组
        if(ch==g->vexs[i])
            break;
    if(i==g->vexnum)                    ///如果循环正常结束则i=g->vexnum,此时说明不存在该顶点
    {
        printf("无%c",ch);
        return ;
    }
    else
    {
        for(j=0; j<g->vexnum; j++)     ///如果存在,则将与顶点相关的边覆盖
            for(k=0; k<g->vexnum; k++)
            {
                if(j>=i&&k>=i)
                    g->arcs[j][k]=g->arcs[j+1][k+1];
                if(j>=i&&k<i)
                    g->arcs[j][k]=g->arcs[j+1][k];
                if(j<i&&k>=i)
                    g->arcs[j][k]=g->arcs[j][k+1];
            }
    }
    for(j=0; j<g->vexnum; j++)         ///覆盖该顶点
        if(j>=i)
            g->vexs[j]=g->vexs[j+1];
    g->vexnum--;
    cout<<"删除该顶点后剩余顶点为:\n";
    for(j=0; j<g->vexnum; j++)
        cout<<g->vexs[j]<<" ";
    cout<<endl;
    cout<<"删除后邻接矩阵为:\n";
    for(j=0; j<g->vexnum; j++)
    {
        for(k=0; k<g->vexnum; k++)
            cout<<g->arcs[j][k]<<" ";
        cout<<endl;
    }
    cout<<"从第一个顶点开始的DFS遍历为:\n";
    DFS(g,0);
}
 
 
void Is_connect(graph *g,int k)        ///利用DFS搜索的思想遍历图,每遍历一个顶点计数加一
{
    visited[k]=true;
    Count++;
    for(int i=0; i<g->vexnum; i++)
        if(g->arcs[k][i]==1&&visited[i]==false)
        {
            Is_connect(g,i);
        }
}
 
void main_menu()                      ///主菜单
{
    cout<<"-----------------------------------\n";
    cout<<"---------程序主菜单----------------\n";
    cout<<"-----------------------------------\n";
    cout<<"---------1图的创立及邻接矩阵-------\n";
    cout<<"---------2查询图中各顶点的度-------\n";
    cout<<"---------3DFS遍历图----------------\n";
    cout<<"---------4BFS遍历图----------------\n";
    cout<<"---------5查询顶点是否在图中-------\n";
    cout<<"---------6判断是否为连通图---------\n";
    cout<<"---------7退出---------------------\n";
    cout<<"---------回车键返回菜单------------\n";
    cout<<"-----------------------------------\n";
    cout<<"---------请选择:(1-7)--------------\n";
}
 
int main()
{
    int i,num;
    char ch;
    graph g;
    while(1)
    {
        system("cls");
        main_menu();
        scanf("%d",&num);
        system("cls");
        switch(num)                                   ///通过输入1-7调用不同的功能
        {
        case 1:
            printf("1图的创立及邻接矩阵\n\n");
            printf("请输入顶点的个数:");
            cin>>g.vexnum;
            cout<<endl;
            printf("请输入边的条数:");
            cin>>g.arcnum;
            printf("请输入各顶点:");
            for(i=0; i<g.vexnum; ++i)
                cin>>g.vexs[i];
            cout<<endl;
            printf("请输入各条边i-j:\n");
            Create(&g);
            printf("输入任意键返回主菜单:");
            system("pause");
            break;
        case 2:
            printf("2查询图中各顶点的度\n\n");
            Du(&g);
            printf("输入任意键返回主菜单:");
            system("pause");
            break;
        case 3:
            printf("3DFS遍历图\n\n");
            printf("请输入开始的顶点:");
            cin>>ch;
            cout<<endl;
            for(i=0;i<g.vexnum;i++)
                if(ch==g.vexs[i])
                    break;
            if(i>=g.vexnum)
            {
                printf("输入数字有误!");
                printf("输入任意键返回主菜单:");
                system("pause");
                break;
            }
            printf("从该点开始DFS搜索为:");
            DFS(&g,i);
            cout<<endl;
            memset(visited,0,sizeof(visited));           ///将访问标志数组初始化为0
            printf("输入任意键返回主菜单:");
            system("pause");
            break;
        case 4:
            printf("4BFS遍历图\n\n");
            printf("请输入开始的顶点:");
            cin>>ch;
            cout<<endl;
            for(i=0;i<g.vexnum;i++)
                if(ch==g.vexs[i])
                    break;
            if(i>=g.vexnum)
            {
                printf("输入数字有误!");
                printf("输入任意键返回主菜单:");
                system("pause");
                break;
            }
            printf("从该点开始BFS搜索为:");
            BFS(&g,i);
            cout<<endl;
            memset(visited,0,sizeof(visited));         ///将访问标志数组初始化为0
            printf("输入任意键返回主菜单:");
            system("pause");
            break;
        case 5:
            printf("5查询顶点是否在图中\n\n");
            printf("请输入要查询的顶点:");
            cin>>ch;
            cout<<endl;
            Is_in_graph(&g,ch);
            cout<<endl;
            memset(visited,0,sizeof(visited));        ///将访问标志数组初始化为0
            printf("输入任意键返回主菜单:");
            system("pause");
            break;
        case 6:
            printf("6判断是否为连通图\n\n");
            Is_connect(&g,0);
            if(Count==g.vexnum)
                printf("YES!");
            else
                printf("NO!");
            cout<<endl;
            Count=0;
            memset(visited,0,sizeof(visited));         ///将访问标志数组初始化为0
            printf("输入任意键返回主菜单:");
            system("pause");
            break;
        case 7:
            printf("退出成功");
            return 0;
        }
    }
}
 
 
 

3. 扩展

逆邻接表
在邻接表中对于有向图有一个很大的缺陷,如果我们比较关心顶点入度那么就需要遍历所有链表。为了避免这种情况出现,我们可以采用逆邻接表来存储,它存储的链表是别的顶点指向它。这样就可以快速求得顶点的入度。

如何对有向图的入度和出度都关心,那么久可以采取十字链表的方式。相当于每一个顶点对应两个链表,一个是它指向别的顶点,一个是别的顶点指向它。

Reference

https://www.zybuluo.com/guoxs/note/257430

https://blog.csdn.net/JYL1159131237/article/details/78504961

https://blog.csdn.net/JD_coder/article/details/79954592

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图的基本概念、存储及基本操作(邻接矩阵法与邻接表法) 的相关文章

  • Copilot 自动编程AI工具

    OpenAI与GitHub联合构建的AI自动编程工具Copilot xff0c Copilot基于自然语言处理模型GPT 3搭建而成 xff0c Copilot预览版已经正式上线Visual Studio Code平台 OpenAI的GPT
  • SQLite的SQL语法

    SQLite库可以解析大部分标准SQL语言 但它也省去了一些特性 并且加入了一些自己的新特性 这篇文档就是试图描述那些SQLite支持 不支持的SQL语法的 查看关键字列表 如下语法表格中 xff0c 纯文本用蓝色粗体显示 非终极符号为斜体
  • 动态链接库dll(Windows/C++)

    1 概念 xff08 1 xff09 动态链接库广泛用于Windows系统及应用程序 xff0c 不能单独被执行 xff0c 在应用程序运行期间被动态调用的模块文件 区别于静态链接库 xff0c 均属于独立的代码编译模块 xff0c 但静态
  • 【Java】反射时获取父类属性并赋值

    1 反射获取父类 在反射获取类里的所有属性的时候 xff0c 会遇到无法访问父类extends里面的值 这时候需要访问父类需要调用Class的方法getSuperclass 对父类进行遍历field 同时如果不想遍历到Object或者某个类
  • linux软件包安装命令——apt-get

    apt get是linux中APT软件包的管理工具 采用shell命令行的方式完成软件的安装 更新 卸载等操作 1 语法 apt get xff08 选项 xff09 xff08 参数 xff09 选项 xff1a c 指定配置文件 o 直
  • 浅谈路由器的wan、lan、wlan口和vlan/trunk口

    背景 另一篇博文分析了一个实际的路由问题 xff0c 为方便问题分析 xff0c 在此列出常用概念 vlan中的trunk口 VLAN Trunk以及三层交换 可以把switch某一端口设为trunk 端口 问题 IP地址分类 xff1a
  • bzoj4864 [BeiJing 2017 Wc]神秘物质

    http www elijahqi win 2018 01 26 bzoj4864 beijing 2017 wc E7 A5 9E E7 A7 98 E7 89 A9 E8 B4 A8 20 E2 80 8E Description 21
  • mysql8设置远程连接详细教程

    这是转载StackOverFlow上的回答 xff0c 原回答点此这里 Remote Access in MySQL 8 Allow access from any host sudo nano etc mysql mysql conf d
  • 倒水问题(bfs)

    题意概述 34 fill A 34 表示倒满A杯 xff0c 34 empty A 34 表示倒空A杯 xff0c 34 pour A B 34 表示把A的水倒到B杯并且把B杯倒满或A倒空 Input 输入包含多组数据 每组数据输入 A B
  • A-化学

    题目概述 假设如上图 xff0c 这个烷烃基有6个原子和5个化学键 xff0c 6个原子分别标号1 6 xff0c 然后用一对数字 a b 表示原子a和原子b间有一个化学键 这样通过5行a b可以描述一个烷烃基 你的任务是甄别烷烃基的类别
  • B-评测系统

    题目概述 例如某次考试一共八道题 xff08 A B C D E F G H xff09 xff0c 每个人做的题都在对应的题号下有个数量标记 xff0c 负数表示该学生在该题上有过的错误提交次数但到现在还没有AC xff0c 正数表示AC
  • week4_C TT的神秘礼物

    题目描述 TT 是一位重度爱猫人士 xff0c 每日沉溺于 B 站上的猫咪频道 有一天 xff0c TT 的好友 ZJM 决定交给 TT 一个难题 xff0c 如果 TT 能够解决这个难题 xff0c ZJM 就会买一只可爱猫咪送给 TT
  • week8_C 班长竞选(Kosaraju算法 SCC缩点)

    题目描述 大学班级选班长 xff0c N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适 xff0c 意见具有传递性 xff0c 即 A 认为 B 合适 xff0c B 认为 C 合适 xff0c 则 A 也认为 C 合
  • week15实验 D_瑞瑞爱上字符串/F_东东:“来不及解释了,快上车!!”

    D 瑞瑞爱上字符串 题目 瑞瑞最近迷上了字符串 xff0c 因此决定出一个字符串的题 给定两个正整数 N K xff0c 考虑所有由 N 2 个 a 和 2 个 b 组成的字符串 xff0c 要求输出其中字典序第 K 小的 例如当 N 61
  • CSP-M4补题 A_TT数鸭子

    题目 这一天 xff0c TT因为疫情在家憋得难受 xff0c 在云吸猫一小时后 xff0c TT决定去附近自家的山头游玩 TT来到一个小湖边 xff0c 看到了许多在湖边嬉戏的鸭子 xff0c TT顿生羡慕 此时他发现每一只鸭子都不 一样
  • 第二道月模csp201604-3 路径解析

    题目 在操作系统中 xff0c 数据通常以文件的形式存储在文件系统中 文件系统一般采用层次化的组织形式 xff0c 由目录 xff08 或者文件夹 xff09 和文件构成 xff0c 形成一棵树的形状 文件有内容 xff0c 用于存储数据
  • 第三道月模csp201609-3炉石传说

    题目 炉石传说 xff1a 魔兽英雄传 xff08 Hearthstone Heroes of Warcraft xff0c 简称炉石传说 xff09 是暴雪娱乐开发的一款集换式卡牌游戏 xff08 如下图所示 xff09 游戏在一个战斗棋
  • 第四道月模csp201809-3 元素选择器

    题目背景 题目描述 输入输出 Input Output Sample Input Sample Output 数据规模和约定 思路分析 根据题意 xff0c 创建element结构体 xff0c 新建element类型数组e xff0c 用
  • Debian设置合上笔记本盖子不休眠

    序言正文 序言 在使用的debian的时候 xff0c 发现在哪都找不到设置合上笔记本盖子不做任何事情的选项 xff0c 不像Ubuntu可以在电源里设置 在这里介绍编辑Login Manager 的配置文件 xff08 logind co
  • 学生认证免费领取——使用阿里云服务器的Ubuntu版本,并进行图形化

    一 前言 我们学习和工作中经常需要使用Linux系统来跑程序 我们可以使用虚拟机装一个Ubuntu镜像 当然我们为了方便也可以使用阿里云的服务器 二 获取服务器 1 到阿里云官网 没有账号的同学注册一个就OK 2 搜索框搜索 学生优惠 3

随机推荐

  • Python Pyside/Pyqt 禁止拉伸窗体

    可能是搜索姿势不正确 xff0c 搜了半天没搜到正确答案 随手做个笔记 值可以写死 xff0c 但是一改UI又要重新改这 xff0c 太麻烦 xff0c 索性 加载UI文件时 def init self 对ui文件进行加载 self ui
  • Win10 编译运行Fortran77程序,开发环境搭建

    有个朋友说我讲的blas中的fortran语法有个地方不正确 xff0c 非说他自己的理解是对的 怎么肯能 xff0c f77都看了十几年了 拿出证据来才行 xff0c 朋友却说自己不知道怎么编译f77程序 好吧 xff0c 那还这么自信呀
  • C++ time(0)函数

    time 0 函数返回当前格林尼治标准时间与格林尼治标准时间1970年0分0秒的时间间隔 头文件 include lt ctime gt 问题 xff1a 得到当前时间 include lt iostream gt include lt c
  • 位运算左移、右移、按位取反

    目录 一 异或习题补充 1 260 只出现一次的数字 III 力扣 xff08 LeetCode xff09 二 位运算左移 1 概念 1 xff09 二进制形态 2 xff09 执行结果 3 xff09 负数左移的执行结果 4 xff09
  • 远程客户端无法连接到ubuntu

    检查SSH是否安装 xff1a ssh localhost 通过APT的安装命令非常方便 xff1a sudo apt install openssh server
  • 使用python读写内存–植物大战僵尸为例 pymem和tkinter

    使用python读写内存 植物大战僵尸为例 pymem和tkinter 废话不多 xff0c 直接上源代码 span class token keyword import span tkinter span class token keyw
  • Paramiko: Python使用paramiko连接主机报错“Authentication timeout”

    问题描述 xff1a 在用Python Paramiko库去连接主机时 始终无法连接 xff0c exception输出错误仅有 Authentication timeout connection 61 paramiko SSHClient
  • 流感传染

    题目描述 有一批易感人群住在网格状的宿舍区内 xff0c 宿舍区为n n的矩阵 xff0c 每个格点为一个房间 xff0c 房间里可能住人 xff0c 也可能空着 在第一天 xff0c 有些房间里的人得了流感 xff0c 以后每天 xff0
  • 获取B站某用户更多的关注数和粉丝数

    获取B站某用户更多的关注数和粉丝数 相关记录 一 前言 B 站最多只能翻 5 页用户的关注数和粉丝数 xff0c 如何能够看到更多呢 方法我也是从网上翻来的 xff0c 记载博客里 xff0c 算是我研究过这个话题了 二 需要的东西 关注数
  • HDU 1692 Destroy the Well of Life-卡时间-(枚举+剪枝)

    题意 xff1a 有n口井 xff0c 编号为1到n xff0c 打破第i口井需要p i 的能量 xff0c 但是只要井被打破里面的水会流到下一口井 xff0c 只要一口井的井水w i 多余一个上限l i 会自动打破 xff0c 求打破第n
  • 一.前言——人类是不是机器人

    一 前言 人类是不是机器人 随着时代的进步 xff0c 人工智能诞生了 又随着人工智能的进步 xff0c ChatGPT诞生了 xff0c 这不仅让我想出一个问题 xff1a 我们人类是不是机器人 xff1f ChatGPT xff0c 发
  • CCF期末预测之最佳阈值

    题目背景 考虑到安全指数是一个较大范围内的整数 小菜很可能搞不清楚自己是否真的安全 xff0c 顿顿决定设置一个阈 xff0c 以便将安全指数 y转化为一个具体的预测结果 会挂科 或 不会挂科 因为安全指数越高表明小菜同学挂科的可能性越低
  • (IOS系列)——TextFile属性设置

    初始化textfield并设置位置及大小 UITextField text 61 UITextField alloc initWithFrame CGRectMake 20 20 130 30 设置边框样式 xff0c 只有设置了才会显示边
  • windows10系统自带linux子系统(WSL)的安装目录

    如题 xff0c 最近一直想能不能不用VM virtualbox Hyper V等以虚拟机方式在windows10系统中安装linux xff0c 以便打造openwrt编译环境 在网上摸索了许久 xff0c 终于找到了一种方法 xff0c
  • 智慧农业IOT-onenet平台简单介绍

    智慧农业IOT onenet平台简单介绍 1 onenet平台简介 1 1 onenet简介 OneNET是由中国移动打造的PaaS物联网开放平台 平台能够帮助开发者轻松实现设备接入与设备连接 xff0c 快速完成产品开发部署 xff0c
  • 万物互联-stm32单片机简介、烧录、编程及其项目环境搭建

    万物互联 stm32单片机简介 烧录 编程 前言 xff1a stm32单片机这里给出简单介绍 xff0c 给不了解的朋友普及下硬件端的基本知识 xff0c 叙述的较为简单 xff0c 想深入研究的朋友可以去一些官方网站 论坛 博客汲取知识
  • 万物互联-IOT-ESP8266功能、作用、AT、连接onenet服务器简单介绍

    万物互联 IOT ESP8266功能 作用 AT 连接onenet服务器简单介绍 1 ESP8266简介 1 1 ESP8266简介 ESP8266是一个完整且自成体系的 WiFi 网络解决方案 xff0c 能够独立运行 xff0c 也可以
  • 云应用系统开发技术考点(面试题相关)

    云应用系统开发技术考点 xff08 面试题相关 xff09 1 CAP理论 概述 xff1a 一个分布式系统最多只能同时满足一致性 xff08 Consistency xff09 可用性 xff08 Availability xff09 和
  • Linux常用命令大全(超详细分类版)

    Linux常用命令大全 xff08 持续收集 分类 xff09 文件操作 常用 cd home 进入 39 home 39 目录 39 cd 返回上一级目录 cd 返回上两级目录 cd 进入个人的主目录 cd user1 进入个人的主目录
  • 图的基本概念、存储及基本操作(邻接矩阵法与邻接表法)

    图的基本概念 存储及基本操作 邻接矩阵法与邻接表法 xff09 1 图的基本概念 1 1 图的定义 图 xff08 Graph xff09 是由顶点的有穷非空集合和顶点之间边的集合组成 xff0c 通常表示为 xff1a G V E xff