图论---图

图-Graph

  • 一、图的基础知识
  • 二、图的存储
    • 2.1 邻接矩阵
    • 2.2 邻接表
  • 三、图的遍历
    • 3.1 DFS
      • 3.1.1 连通分量与强连通分量
      • 3.1.2 伪代码
      • 3.1.3 例题
    • 3.2 BFS
      • 3.2.1 伪代码
      • 3.2.2 层次遍历
      • 3.2.3 例题
  • 四、最短路径
    • 4.1 Dijkstra
      • 4.1.1 算法说明
      • 4.1.2 伪代码
      • 4.1.3 代码实现
    • 4.2 Floyd
      • 4.2.1 算法说明
      • 4.2.2 伪代码
      • 4.2.3 代码实现
  • 五、拓扑排序
    • 5.1 有向无环图
    • 5.2 拓扑排序

一、图的基础知识

1、图的概念

a: 顶点和边组成的网络;
b: 有向图和无向图;

2、度

顶点的度 = 和该顶点相连的边的条数。
有向图中涉及出度和入度。

二、图的存储

邻接矩阵:使用二维数组对图进行存储。
邻接表

2.1 邻接矩阵

如果有N个顶点:

vector<vector<int> > graph(N + 1, vector<int>(N +1, INT_MAX));
// INT_MAX的头文件为, 表示不可达
// 不要忘记将graph[i][i] = 0

2.2 邻接表

借助 pair

vector<pair<int, int> > edge[N];
// 第一个int 表示边的终点
// 第二个int 表示边权
// 如何访问? edge[i].first edge[i].second

// 如何添加?1->3边权为4;
edge[1].push_back(make_pair(3, 4));

借助 struct

struct node{
   
    int v; // 表示终点
    int w; // 表示边权
};
vector<node> edge[N];

// 如何添加?1->3边权为4;
node temp;
temp.v = 3;
temp.w = 4;
edge[1].push_back(temp);

三、图的遍历

1、深度优先搜索(DFS);
2、广度优先搜索(BFS);

3.1 DFS

3.1.1 连通分量与强连通分量

连通分量:
在无向图中,若任意两个顶点都连通,则称此图为连通图,否则,称为非连通图,而非连通图中的极大连通子图为连通分量。

强连通分量:
在有向图中,若任意两个顶点都强连通,则称此图为强连通图,否则,称为非强连通图,而非强联通图中的极大强连通子图为强连通分量。

示例: 图论---图_第1张图片

3.1.2 伪代码

DFS(u){
    visit[u] = true;  // 设置顶点u已被访问
    for(从u出发能到达的所有顶点v)
        if visit[v] == false
            DFS(v);
}

DFSTrave(G){ // 遍历图G
    for(图G的所有顶点u)
        if visit[u] == false
            DFS(u);
}

3.1.3 例题

题目描述:
给出若干人之间的通话记录(视为无向边),这些通话将它们分为若干组。每个组的总边权设为所有通话记录的长度之和。现给定一个阈值K,若一个组的总边权超过K,并满足组员人数超过2,则将该组视为“犯罪团伙”,其中,点权最大的人为头目。要求:输出犯罪团伙的个数,并按头目姓名字典需从小到大的顺序输出每个“犯罪团伙”的头目姓名和成员人数。

示例:

输入:

8条通话记录 阈值为59
8 59
A B 10
B A 20
D E 5
A C 40
E D 70
F G 30
G H 20
H F 10

输出:

2
A 3
G 3

#include<iostream>
#include<vector>
#include<map>
#include<string>
using namespace std;
const int maxn = 2010;

int N, K; // N 代表有几条通话记录  K 代表阈值
int number = 0;
vector<vector<int> > G(maxn, vector<int>(maxn, 0));
vector<int> weight(maxn, 0); // 记录每个人的通话时间
vector<bool> visit(maxn, false);
map<int, string> IntToString;
map<string, int> StringToInt;
map<string, int> Gang;

void DFS(int x, int &head, int &numMember, int &totalValue){
   
    numMember++;
    visit[x] = true;
    if(weight[x] > weight[head])
        head = x;
    for(int i = 0; i < number; i++){
   
        if(G[x][i] > 0){
   
            totalValue += G[x][i

你可能感兴趣的:(数据结构,图论,算法)