浙大数据结构第六周之初识图

news2024/11/19 12:32:04

题目详情:06-图1 列出连通集

给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:

输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:

按照"{ v1​ v2​ ... vk​ }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。

输入样例:

8 6
0 7
0 1
2 0
4 1
2 4
3 5

输出样例:

{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

主要思路:

三个重要模块:

(一)图的存储

这次尝试的是用二维邻接矩阵,以后有机会尝试一位邻接矩阵和邻接表

二维邻接矩阵关键四步:

(1)定义图的数据结构,分为图节点与边节点两部分

/*图节点*/
typedef struct GraphNode* PToGraphNode;
struct GraphNode {
    int VertexNums;
    int EdgeNums;
    int WeightBetweenTwoEdge[MAX_SIZE][MAX_SIZE];
};
typedef PToGraphNode MatrixGraph;
/*边界点*/
typedef struct EdgeNode* PToEdgeNode;
struct EdgeNode {
    int Start, End;
    int Weight;
};
typedef PToEdgeNode Edge;

(2)创建一个没有边的图

MatrixGraph CreateGraph() {
    int vertixNums;
    scanf("%d", &vertixNums);

    MatrixGraph Graph = (MatrixGraph)malloc(sizeof(struct GraphNode));
    Graph -> VertexNums = vertixNums;
    Graph -> EdgeNums = 0;
    for(int i = 0; i < (Graph -> VertexNums); i++) {
        for(int j = 0; j < (Graph -> VertexNums); j++) {
            Graph -> WeightBetweenTwoEdge[i][j] = 0;
        }
    }
    return Graph;
}

 (3)插入边

void InsertEdge(MatrixGraph graph, Edge edge) {
    graph -> WeightBetweenTwoEdge[edge -> Start][edge -> End] = edge -> Weight;
    graph -> WeightBetweenTwoEdge[edge -> End][edge -> Start] = edge -> Weight;
}

(4)创建图

MatrixGraph BuildGraph() {
    MatrixGraph graph = CreateGraph();
    scanf("%d", &(graph -> EdgeNums));
    if((graph -> EdgeNums) != 0) {
        for(int i = 0; i < (graph -> EdgeNums); i++) {
            Edge edge = (Edge)malloc(sizeof(struct EdgeNode));
            scanf("%d %d", &(edge -> Start), &(edge -> End));
            edge -> Weight = WEIGHT; 
            InsertEdge(graph, edge); 
        }
    }
    return graph;
}

(二)DFS的实现

关于图的DFS 有常规思路如下:

void DFS(u) {
  vis[u] = true;	// 设置为已访问
  Visit[u]           //访问节点
  for(从u出发能达到的所有顶点v)	// 枚举从u出发可以到达的所有顶点
    	if vis[v] == false	// 没有被访问
        	DFS(v)	// 递归访问
}

void DFSTravel(G) {
  for(G所有顶点u)
    if vis[u] == false
      DFS(u)
}

(三)BFS的实现 

BFS常规思路

void BFS(int u) {
  queue q;
  q.push(u);
  inq[u] = true;	// 设置 u 已经入队
  while(!q.empty()) {
    Visit[q.front()]        //取出队首元素进行访问
    for(从u出发可到达所有顶点v)
      	if(inq[v] == false)
          将 v 入队
          inq[v] = true
  }
}

void BFSTravel() {
  for(G所有顶点u) {
    if(inq[u] == false)
      	BFS(u)
  }
}

代码实现:

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 11
#define WEIGHT 1
/*用邻接矩阵定义图的数据结构*/
/*图节点*/
typedef struct GraphNode* PToGraphNode;
struct GraphNode {
    int VertexNums;
    int EdgeNums;
    int WeightBetweenTwoEdge[MAX_SIZE][MAX_SIZE];
};
typedef PToGraphNode MatrixGraph;
/*边界点*/
typedef struct EdgeNode* PToEdgeNode;
struct EdgeNode {
    int Start, End;
    int Weight;
};
typedef PToEdgeNode Edge;
/*---------------------------*/
/*初始化一个无边的图*/
MatrixGraph CreateGraph() {
    int vertixNums;
    scanf("%d", &vertixNums);

    MatrixGraph Graph = (MatrixGraph)malloc(sizeof(struct GraphNode));
    Graph -> VertexNums = vertixNums;
    Graph -> EdgeNums = 0;
    for(int i = 0; i < (Graph -> VertexNums); i++) {
        for(int j = 0; j < (Graph -> VertexNums); j++) {
            Graph -> WeightBetweenTwoEdge[i][j] = 0;
        }
    }
    return Graph;
}
/*边的插入*/
void InsertEdge(MatrixGraph graph, Edge edge) {
    graph -> WeightBetweenTwoEdge[edge -> Start][edge -> End] = edge -> Weight;
    graph -> WeightBetweenTwoEdge[edge -> End][edge -> Start] = edge -> Weight;
}
/*创建图*/
MatrixGraph BuildGraph() {
    MatrixGraph graph = CreateGraph();
    scanf("%d", &(graph -> EdgeNums));
    if((graph -> EdgeNums) != 0) {
        for(int i = 0; i < (graph -> EdgeNums); i++) {
            Edge edge = (Edge)malloc(sizeof(struct EdgeNode));
            scanf("%d %d", &(edge -> Start), &(edge -> End));
            edge -> Weight = WEIGHT; 
            InsertEdge(graph, edge); 
        }
    }
    return graph;
}
int Visited[MAX_SIZE];
void DFS(MatrixGraph graph, int index) {
    Visited[index] = 1;
    printf("%d ", index);
    /*遍历当下节点(下标为index)所有相邻节点*/
    for(int i = 0; i < (graph -> VertexNums); i++) {
        /*判断当下节点的相邻节点,两个节点间连通且相邻的节点没有访问过*/
        if(graph -> WeightBetweenTwoEdge[index][i] == WEIGHT && Visited[i] == 0) {
            Visited[i] = 1;
            DFS(graph, i);
        }
    }
    return;
}
void Erase(int* array, int num) {
    for(int i = 0; i < num; i++) {
        array[i] = 0;
    }
    return;
}
/*先实现循环队列*/
#define MAX_QUEUE_SIZE 10
 
typedef struct {
    int data[MAX_QUEUE_SIZE];
    int front;
    int rear;
    int count;
} CircularQueue;
 
void initialize_queue(CircularQueue* queue) {
    queue->front = 0;
    queue->rear = -1;
    queue->count = 0;
}
 
int is_full(CircularQueue* queue) {
    return (queue->count == MAX_QUEUE_SIZE);
}
 
int is_empty(CircularQueue* queue) {
    return (queue->count == 0);
}
 
int enqueue(CircularQueue* queue, int data) {
    if(is_full(queue)) {
        return 0;
    }
    queue->rear = (queue->rear + 1) % MAX_QUEUE_SIZE;    //因为是循环,所以不是简单加1,还要取余
    queue->data[queue->rear] = data;
    (queue->count)++;
    return 1;
}
 
int dequeue(CircularQueue* queue) {
    if(is_empty(queue)) {
        return -1;
    }
    int data = queue->data[queue->front];
    queue->front = (queue->front + 1) % MAX_QUEUE_SIZE;
    queue->count--;
    return data;
}
void BFS(MatrixGraph graph, int index) {
    CircularQueue queue;
    initialize_queue(&queue);
    
    Visited[index] = 1;
    enqueue(&queue, index);

    while(!is_empty(&queue)) {
        index = dequeue(&queue);
        printf("%d ", index);
        for(int i = 0; i < (graph -> VertexNums); i++) {
            if(Visited[i] == 0 && graph -> WeightBetweenTwoEdge[index][i] == WEIGHT) {
                Visited[i] = 1;
                enqueue(&queue, i);
            }
        }
    }
}
int main() {
    MatrixGraph graph = BuildGraph();
    for(int i = 0; i < (graph -> VertexNums); i++) {
        if(Visited[i] == 0) {   //表示一个连通集的开始
            printf("{ ");
            DFS(graph, i);
            printf("}\n");
        }
    }
    Erase(Visited, MAX_SIZE);
    for(int i = 0; i < (graph -> VertexNums); i++) {
        if(Visited[i] == 0) {
            printf("{ ");
            BFS(graph, i);
            printf("}\n");
        }
    }
    return 0;
}

题目详情:06-图2 Saving James Bond - Easy Version

This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the world's most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake filled with crocodiles. There he performed the most daring action to escape -- he jumped onto the head of the nearest crocodile! Before the animal realized what was happening, James jumped again onto the next big head... Finally he reached the bank before the last crocodile could bite him (actually the stunt man was caught by the big mouth and barely escaped with his extra thick boot).

Assume that the lake is a 100 by 100 square one. Assume that the center of the lake is at (0,0) and the northeast corner at (50,50). The central island is a disk centered at (0,0) with the diameter of 15. A number of crocodiles are in the lake at various positions. Given the coordinates of each crocodile and the distance that James could jump, you must tell him whether or not he can escape.

Input Specification:

Each input file contains one test case. Each case starts with a line containing two positive integers N (≤100), the number of crocodiles, and D, the maximum distance that James could jump. Then N lines follow, each containing the (x,y) location of a crocodile. Note that no two crocodiles are staying at the same position.

Output Specification:

For each test case, print in a line "Yes" if James can escape, or "No" if not.

Sample Input 1:

14 20
25 -15
-25 28
8 49
29 15
-35 -2
5 28
27 -29
-8 -28
-20 -35
-25 -20
-13 29
-30 15
-35 40
12 12

Sample Output 1:

Yes

Sample Input 2:

4 13
-12 12
12 12
-12 -12
12 -12

Sample Output 2:

No

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

简单翻译:

就是在以所给的最远跳跃距离为半径这个限制,看能不能找到一条从湖心到湖岸的路径

主要思路:

(一)利用图,将人,鳄鱼和岸都视为节点,分为第一跳,中间跳与最后跳上岸三种情况,如果满足,只要满足限制条件就在两个节点之间插入边,然后利用DFS遍历图看有无路径即可

虽然但是,还是有一个测试点过不了……先贴在这边,看看以后能不能看出问题

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_SIZE 101
#define WEIGHT 1
#define ISLANDRADIUS 7.5
#define BOUND 50
typedef struct GraphNode* PToGraphNode;
struct GraphNode {
    int VertexNums;
    int EdgeNums;
    int WeightBetweenTwoNodes[MAX_SIZE][MAX_SIZE];
};
typedef PToGraphNode MatrixGraph;
typedef struct EdgeNode* PToEdgeNode;
struct EdgeNode {
    int Start, End;
    int Weight;
};
typedef PToEdgeNode Edge;
MatrixGraph CreateEmptyGraph(int vertexNums) {
    MatrixGraph graph = (MatrixGraph)malloc(sizeof(struct GraphNode));
    graph -> VertexNums = vertexNums;
    graph -> EdgeNums = 0;
    for(int i = 0; i < (graph -> VertexNums); i++) {
        for(int j = 0; j < (graph -> VertexNums); j++) {
            graph -> WeightBetweenTwoNodes[i][j] = 0;
        }
    }    
    return graph;
}
Edge InitalEdge(int start, int end, int weight) {
    Edge edge = (Edge)malloc(sizeof(struct EdgeNode));
    edge -> Start = start;
    edge -> End = end;
    edge -> Weight = weight;
    return edge;
}
void InsertEdge(MatrixGraph graph, Edge edge) {
    int start = edge -> Start;
    int end = edge -> End;
    graph -> WeightBetweenTwoNodes[start][end] = edge -> Weight;
    graph -> WeightBetweenTwoNodes[end][start] = edge -> Weight;
    return;
}
typedef struct VertexNode* PToVettex; 
struct VertexNode {
    int XLabel, Ylabel;
};
typedef PToVettex Vertex;
int Max(int a, int b) {
    return a > b ? a : b;
}
MatrixGraph BuildGraph() {
    int crocodileNums, maxDistance;
    scanf("%d %d", &crocodileNums, &maxDistance);
    MatrixGraph graph = CreateEmptyGraph(crocodileNums + 2);
    Vertex vertex = (Vertex)malloc(sizeof(struct VertexNode) * (crocodileNums + 1));
    //0号节点代表湖心岛,1~vertixNums节点代表鳄鱼
    for(int i = 1; i <= crocodileNums; i++) {
        scanf("%d %d", &(vertex[i].XLabel), &(vertex[i].Ylabel));
    }

    //判断从小岛可以跳到几只鳄鱼背上,如果可以,就在岛代表的节点与鳄鱼代表的节点之间插入一条边
    for(int i = 1; i <= crocodileNums; i++) {
        int distanceSquare = pow(vertex[i].XLabel, 2) + pow(vertex[i].Ylabel, 2);
        if(pow((ISLANDRADIUS + maxDistance), 2) >= distanceSquare) {
            Edge edge = InitalEdge(0, i, WEIGHT);
            InsertEdge(graph, edge);
            free(edge);
        }
    }

    //判断是否可以在两条鳄鱼间跳跃
    for(int i = 1; i <= crocodileNums; i++) {
        int plotStartX = vertex[i].XLabel;
        int plotStartY = vertex[i].Ylabel;
        for(int j = i + 1; j <= crocodileNums; j++) {
            int plotEndX = vertex[j].XLabel;
            int plotEndY = vertex[j].Ylabel;
            int distanceSquare = pow((plotEndX - plotStartX), 2) + pow((plotEndY - plotStartY), 2);
            if(distanceSquare <= pow(maxDistance, 2)) {
                Edge edge = InitalEdge(i, j, WEIGHT);
                InsertEdge(graph, edge);
                free(edge);
            }
        }
    }

    //判断是否可以从鳄鱼跳到岸上
    for(int i = 1; i <= crocodileNums; i++) {
        int absPlotXLabel = abs(vertex[i].XLabel);
        int absPlotYLabel = abs(vertex[i].Ylabel);
        if(absPlotXLabel + maxDistance >= 50 || absPlotYLabel + maxDistance >= 50) {
            Edge edge = InitalEdge(i, crocodileNums + 1, WEIGHT);
            InsertEdge(graph, edge);
            free(edge);
        }    
    }

    return graph;
}
int Visited[MAX_SIZE];
int flag = 0;
void DFS(MatrixGraph graph, int index) {
    Visited[index] = 1;
    if(index == (graph -> VertexNums) - 1) {    //表示岸边的节点的下标是总结点数-1
        flag = 1;
        return;
    }

    for(int i = 1; i < (graph -> VertexNums); i++) {
        if(graph -> WeightBetweenTwoNodes[index][i] == WEIGHT && Visited[i] == 0) {   
            DFS(graph, i);
        }
    }
}
int main() {
    MatrixGraph graph = BuildGraph();
    DFS(graph, 0);
    if(flag == 1) printf("Yes\n");
    else printf("No\n");
    system("pause");
    return 0;
}

贴一下别人正确的代码

#include<stdio.h>
#include<stdbool.h>
#include<math.h>

#define MaxVertexNum 100
#define Diameter 15

typedef int Crocodile;

typedef struct LocOfCro{
    int x;
    int y;
}Location;

int Nc, distance;
bool visited[MaxVertexNum] = { false };
Location crocodiles[MaxVertexNum];

void AddCrocodile();
void Save007(Location Crocodile[]);
int DFS(Crocodile V);
bool IsSafe(Crocodile V);
bool FirstJump(V);
bool Jump(V, W);

int main() {
    AddCrocodile();
    Save007(crocodiles);
    return 0;
}

void AddCrocodile() {
    int v1, v2;
    scanf("%d", &Nc);
    /* CreateLocation */
    for (int i = 0; i < Nc; i++) {
        crocodiles[i].x = crocodiles[i].y = -1;
    }
    scanf("%d", &distance);
    for (int i = 0; i < Nc; i++) {
        scanf("%d %d", &v1, &v2);
        /* AddCrocodile */
        crocodiles[i].x = v1;
        crocodiles[i].y = v2;
    }
}

int DFS(Crocodile i) {
    int answer = 0;
    visited[i] = true;
    if (IsSafe(i))
        answer = 1;
    else {
        for (int j = 0; j < Nc; j++)
            if (!visited[j] && Jump(i,j)) {
                answer = DFS(j);
                if (answer == 1)
                    break;
            }
    }
    return answer;
}

void Save007(Location crocodiles[]) {
    int answer = 0;
    for (int i = 0; i < Nc; i++) {
        if (!visited[i] && FirstJump(i)) {
            answer = DFS(i);
            if (answer == 1) break;
        }
    }
    if (answer == 1) printf("Yes");
    else printf("No");
}

bool IsSafe(Crocodile i) {
    return (abs(crocodiles[i].x) + distance >= 50) || (abs(crocodiles[i].y) + distance >= 50);
}

bool FirstJump(Crocodile i) {
    return sqrt(pow(crocodiles[i].x + 0.0, 2) + pow(crocodiles[i].y + 0.0, 2)) <= (Diameter / 2 + distance);
}

bool Jump(int V, int W) {
    return sqrt((crocodiles[V].x - crocodiles[W].x) * (crocodiles[V].x - crocodiles[W].x)
        + (crocodiles[V].y - crocodiles[W].y) * (crocodiles[V].y - crocodiles[W].y)) <= distance;
}

(二)不用图(有空再想想吧)

题目详情:06-图3 六度空间

“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。

“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。


图1 六度空间示意图

“六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这样的研究具有太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通信等工具,能够体现社交网络关系的一手数据已经逐渐使得“六度空间”理论的验证成为可能。

假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。

输入格式:

输入第1行给出两个正整数,分别表示社交网络图的结点数N(1<N≤103,表示人数)、边数M(≤33×N,表示社交关系数)。随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到N编号)。

输出格式:

对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。

输入样例:

10 9
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10

输出样例:

1: 70.00%
2: 80.00%
3: 90.00%
4: 100.00%
5: 100.00%
6: 100.00%
7: 100.00%
8: 90.00%
9: 80.00%
10: 70.00%

代码长度限制

16 KB

时间限制

2500 ms

内存限制

64 MB 

主要思路:

利用BFS搜索,难点在于如何判断最后一个节点从而积累层数,解决方法是要先深刻理解BFS就是拓展层序遍历,弹出的是中心节点,加入的是围绕其的节点,所以分别记录当前层最后一个节点与上一层最后一个节点,当现在的中心节点等于上一层的最后一个节点就说明有一层遍历完了

第一次写错误:

(1)忽视了节点是从1开始编号的

(2)人计数时从1开始,因为当前节点也在内

(3)一开始用DFS,但有问题,具体原因可以参见这篇文章

代码实现:

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 1005
#define WEIGHT 1
typedef struct GraphNode* PToGraphNode;
struct GraphNode {
    int VertexNums;
    int EdgeNums;
    int WeightBetweenTwoNodes[MAX_SIZE][MAX_SIZE];
};
typedef PToGraphNode MatrixGraph;
typedef struct EdgeNode* PToEdgeNode;
struct EdgeNode {
    int Start, End;
    int Weight;
};
typedef PToEdgeNode Edge;
MatrixGraph CreateEmptyGraph(int vertexNums) {
    MatrixGraph graph = (MatrixGraph)malloc(sizeof(struct GraphNode));
    graph -> VertexNums = vertexNums;
    graph -> EdgeNums = 0;
    for(int i = 1; i <= vertexNums; i++) {
        for(int j = 1; j <= vertexNums; j++) {
            graph -> WeightBetweenTwoNodes[i][j] = 0;
        }
    }
    return graph;
}
void InsertEdge(MatrixGraph graph, Edge edge) {
    int start = edge -> Start;
    int end = edge -> End;
    graph -> WeightBetweenTwoNodes[start][end] = edge -> Weight;
    graph -> WeightBetweenTwoNodes[end][start] = edge -> Weight;
    return;
}
MatrixGraph BuildGraph() {
    int vertexNums;
    scanf("%d", &vertexNums);
    MatrixGraph graph = CreateEmptyGraph(vertexNums);
    scanf("%d", &(graph -> EdgeNums));
    for(int i = 1; i <= (graph -> EdgeNums); i++) {
        int start, end;
        scanf("%d %d", &start, &end);
        Edge edge = (Edge)malloc(sizeof(struct EdgeNode));
        edge -> Start = start;
        edge -> End = end;
        edge -> Weight = WEIGHT;
        InsertEdge(graph, edge);
        free(edge);
    }
    return graph;
}
/*先实现循环队列*/
#define MAX_QUEUE_SIZE 1005
 
typedef struct {
    int data[MAX_QUEUE_SIZE];
    int front;
    int rear;
    int count;
} CircularQueue;
 
void initialize_queue(CircularQueue* queue) {
    queue->front = 0;
    queue->rear = -1;
    queue->count = 0;
}
 
int is_full(CircularQueue* queue) {
    return (queue->count == MAX_QUEUE_SIZE);
}
 
int is_empty(CircularQueue* queue) {
    return (queue->count == 0);
}
 
int enqueue(CircularQueue* queue, int data) {
    if(is_full(queue)) {
        return 0;
    }
    queue->rear = (queue->rear + 1) % MAX_QUEUE_SIZE;    //因为是循环,所以不是简单加1,还要取余
    queue->data[queue->rear] = data;
    (queue->count)++;
    return 1;
}
 
int dequeue(CircularQueue* queue) {
    if(is_empty(queue)) {
        return -1;
    }
    int data = queue->data[queue->front];
    queue->front = (queue->front + 1) % MAX_QUEUE_SIZE;
    queue->count--;
    return data;
}

int Visited[MAX_SIZE];
int PeopleInside = 1;
void Clear(int* array, int size) {
    for(int i = 1; i <= size; i++) array[i] = 0;
    return;
}
int peopleInside = 1;
void BFS(MatrixGraph graph, int center) {   //用center命名更符合BFS搜索本质,一个节点为中心将其临近节点全部压入
    CircularQueue myQueue;
    initialize_queue(&myQueue);
    Visited[center] = 1;
    enqueue(&myQueue, center);
    int thisLevelTail = -1;
    int level = 0;
    int lastTail = center;
    while(!is_empty(&myQueue)) {
        center = dequeue(&myQueue);
        for(int i = 1; i <= (graph -> VertexNums); i++) {
            if(Visited[i] == 0 && graph -> WeightBetweenTwoNodes[center][i] == WEIGHT) {
                enqueue(&myQueue, i);
                thisLevelTail = i;   //thisleveltail记录的是这一层的最后一个
                Visited[i] = 1;
                peopleInside++;
            }
        }
        if(center == lastTail) {    //如果这一层中心点到了上一层末尾,说明队列里之后存放就是下一层节点了
            level++;
            lastTail = thisLevelTail;
        }
        if(level == 6) break;
    }
}
int main() {
    MatrixGraph graph = BuildGraph();
    int totalPeople = graph -> VertexNums;
    for(int i = 1; i <= totalPeople; i++) {
        Clear(Visited, totalPeople);
        BFS(graph, i);
        printf("%d: %.2f\%\n", i, 1.0 * peopleInside / (totalPeople) * 100);
        peopleInside = 1;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543137.html

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

相关文章

SAP从入门到放弃系列之MTS策略测试记录

​包括&#xff1a;10策略、11策略、30策略、40策略、52策略、63策略。 10策略 业务特点&#xff1a; 策略 10 在大规模生产场景中特别有用&#xff0c;它通常与重复制造 (REM) 相结合。如果企业PMC排产时&#xff0c;希望产品由生产计划&#xff08;需求管理&#xff09;决…

了解“感应雷”危害,针对性防护

直击雷的危害&#xff0c;比较容易理解&#xff0c;其防范措施也相对简单明了——避雷针、引下线、接地装置&#xff08;当然&#xff0c;这里面也有很多的细节和要求&#xff0c;也是需要专业人员来从事的&#xff0c;在此就不展开了&#xff09;&#xff0c;所以对直击雷的防…

springCloud使用maven

springCloud项目使用maven集成nexus 一&#xff1a;故事背景二&#xff1a;基础概念2.1 什么是Maven2.2 什么是nexus 三&#xff1a;实操3.1 setting文件配置3.2 项目内pom.xml配置3.3 jar上传3.3.1 maven插件上传3.3.2 mvn命令上传3.3.3 页面上传3.3.4 通过Rest的方式进行上传…

c++之到底什么时候需要加入析构函数定义?以及内存泄漏

析构函数(destructor)是在类对象销毁时自动调用的特殊成员函数。它的主要作用是释放对象的资源,如堆内存、文件、网络连接等。析构函数的特点是: 1. 析构函数名称与类名相同,前面加~。如~MyClass()。 2. 析构函数没有返回类型。 3. 析构函数可以重载,但不能有参数。 4. 一个…

2023年认证杯二阶段C题数据合并python以及matlab多途径实现代码

对于每种心率下给出的数据&#xff0c;我们需要进行合并才能方便后续处理&#xff0c;这里为大家展示利用python以及matlab分别实现合并的代码 import pandas as pd import os# 创建一个空的DataFrame对象 merged_data pd.DataFrame()# 设置数据文件所在的文件夹路径 folder_…

本地编译和交叉编译的理解

1、本地编译&#xff1a;常见的软件开发&#xff0c;都是属于本地编译&#xff1a;在当前的PC下&#xff0c;x86的CPU下&#xff0c;直接编译出来程序&#xff0c;可以运行的程序&#xff08;或者库文件&#xff09;&#xff0c;其可以直接在当前的环境&#xff0c;即x86的CPU下…

【linux】挖矿病毒nanominer伪装成python占用服务器GPU!本文带你分析并杀毒!

病毒表现 gpustat -cpu 可以看到root用户将GPU的核心跑满了每个占用都是100%&#xff0c;显存吃了6G多。 nvidia-smi 不能正常显示GPU被哪些进程占用 ![在这里插入图片描述](https://img-blog.csdnimg.cn/780f90080a084a44ac59227e384f985b.png 病毒文件分析 在/tmp/.x/…

浅比一下,各大免费CDN的速度

前言 CDN那么多&#xff0c;到底哪个体验最好呢&#xff1f;今天来简单对比一下免费的CDN之间的差距&#xff0c;看看那家最适合白嫖 百度CDN 官网&#xff1a;https://su.baidu.com/ 平均速度62.7ms&#xff0c;需要备案的域名才行&#xff0c;支持SSL&#xff0c;流量5G/天…

Spring 整合 Mybatis -- Spring入门保姆级教程(四)

文章目录 前言五、Spring 整合 Mybatis1.Mybatis一般开发流程2.spring整合mybatis思路分析3.Spring整合Mybatis环境准备&#xff08;注解开发&#xff09;4.Spring整合Mybatis5.小结 引用网站及博客总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类…

​AI + 非遗文化传播,人工智能师资培训重磅招募

大语言模型热度空前&#xff0c;诸如文心一言、 ChatGPT 等已经能够与人对话互动、回答问题、协助创作&#xff0c;逐渐应用于人们的工作和生活&#xff0c;也引发了社会热议。为推动大模型及人工智能相关专业人员的培养&#xff0c;同时将人工智能技术融入非遗文化传播&#x…

电子采购系统实现方式(SRM供应商管理)

企事业数字化转型专家&#xff0c;提供各类应用解决方案。您身边的赋能小助手&#xff01; 文章目录 前言一、当下采购的痛点二、解决方案-供应商管理1.供应商管理 三、解决方案-企业询价、供应商报价管理四、解决方案-采购订单五、送货、到货、订单管理总结 前言 随着各类产业…

软件工程(五) 结构化需求与面向对象需求分析

1、结构化需求分析(SA) 结构化需求分析要完成功能模型、数据模型和行为模型的构建。 1.1、功能模型 一般用数据流图进行建模,也就是DFD。 比如我们要开发一个子啊先教育平台系统,我们把这个系统看作一个整体,去分析哪些人员会用到这个系统。比如有学员,培训部,辅导老师…

阿里云、腾讯云、移动云飙“价”:智能普惠成新风向?

经过过去一年的“低迷”境况之后&#xff0c;2023年云服务商因为AI大模型的爆发&#xff0c;重新燃起了斗志。站在当下的时间节点&#xff0c;云服务商们也在重新思考如何在新形势下&#xff0c;让自己占据更大的优势&#xff0c;于是一场围绕“技术竞争与市场争夺”的新战争打…

spring boot 项目yml方式区分开发、测试生产,并在maven中配置

1、新建配置文件&#xff0c;分别为application.yml、application-dev.yml、application-test.yml和application-prod.yml 2、在application.yml文件中添加如下代码 spring:profiles:## ??pom???????profile??active: "profiles.active"3、在pom中的proj…

class生命周期

组件实例 化的过程称作组件的挂载(mount)。 组件挂载的过程: 构造函数(constructor)最先执行&#xff0c;componentWillMount() 会在 render() 方法之前 执行&#xff0c;而 componentDidMount() 在 render() 方法之后执行。组件更新&#xff0c;调用顺序如下: • componentWi…

为什么 PostQuitMessage 会被设计出来?

众所周知&#xff0c;我们可以使用 SendMessage 或者 PostMessage 来发送消息&#xff0c;那为什么在 Win32 API 中&#xff0c;会单独设计一个 PostQuitMessage 呢? 有一位读者 A. Skrobov 问我&#xff0c;”PostQuitMessage 和 PostThreadMessage(GetCurrentThreadId, WM_…

【PyTorch框架】——框架安装使用流程搭建PyTorch神经网络气温预测

目录 一、引言 二、使用流程——最简单例子试手 三、分类任务——气温预测 总结&#xff1a; 一、引言 Torch可以当作是能在GPU中计算的矩阵&#xff0c;就是ndarray的GPU版&#xff01;TensorFlow和PyTorch可以说是当今最流行的框架&#xff01;PyTorch用起来简单&#xff…

【开发者指南】如何在MyEclipse中使用HTML或JSP设计器?(下)

MyEclipse v2022.1.0正式版下载 三、设计编辑基础 “设计”窗口由所见即所得的网页设计画布和UI控制面板组成。在此窗口中&#xff0c;您可以插入、编辑、删除和移动 HTML 和 JSP UI 控件和文本。拖放操作可以轻松实现重新定位设计画布上的UI控件。扩展的复制/粘贴操作能够将…

Unity3D :PlayableGraph

推荐&#xff1a;将NSDT场景编辑器加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 PlayableGraph PlayableGraph 定义一组绑定到 GameObject 或组件的可播放输出项。PlayableGraph 还定义一组可播放项及其依赖关系。图 1 提供了一个示例。 PlayableGraph 负责管理可…

卷积神经网络实例

文章目录 1. 数据输入2. 创建卷积模型并训练3. 超参数选择 卷积神经网络(CNN)主要由卷积层(Convolutional Layer)、池化层(Pooling Layer)、激活层(Activation Layer)和全连接层(Fully-connected Layer)组成。 卷积层(Convolutional Layer)&#xff1a;卷积层是CNN的核心组成部…