有向完全图(这次一定弄懂完全图)

有向完全图指所有节点之间都存在有向边的有向图,是一种重要的图结构。在本文中,将介绍有向完全图的定义、性质、应用及代码实现。

一、定义

有向完全图是指一个有向图,其中每个节点之间都存在有向边,即对于节点i和节点j(i ≠ j),必定存在边和。因此,它的边数为n*(n-1)。

二、性质

有向完全图有以下性质:

1. 每个节点的入度和出度均为n-1。

2. 任意两个节点之间都存在路径。

3. 带权有向完全图中,所有的非负权值之和为n*(n-1)/2。

三、应用

有向完全图在图论及计算机科学中应用广泛,其中较为典型的应用场景有以下几种:

1. 任务调度:将n个任务看作节点,对于两个任务i和任务j,若任务i的执行必须在任务j之前,则加入边

    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            if(i != j){
                add_edge(i, j); // 添加边
            }
        }
    }

2. 竞赛问题:将n个选手看作节点,若选手i能够战胜选手j,则加入边

    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            if(i != j){
                add_edge(i, j); // 添加边
            }
        }
    }

3. 网络拓扑:将网络节点看作有向完全图的节点,若节点i能够“直接”到达节点j,则加入边

    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            if(i != j){
                add_edge(i, j); // 添加边
            }
        }
    }

四、代码实现

以下为C++的邻接表实现代码:

const int MAXN = 1000; // 最大节点数
int n, cnt = 0;
int head[MAXN], nxt[MAXN * MAXN], ver[MAXN * MAXN];
int in_deg[MAXN], out_deg[MAXN];

void add_edge(int a, int b){
    ver[++cnt] = b;
    nxt[cnt] = head[a];
    head[a] = cnt;
    in_deg[b]++;
    out_deg[a]++;
}

int main(){
    cin >> n; // 输入节点数
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            if(i != j){
                add_edge(i, j); // 添加边
            }
        }
    }
    return 0;
}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平