📌  相关文章
📜  查找图中所有顶点的进出度

📅  最后修改于: 2022-05-13 01:57:54.035000             🧑  作者: Mango

查找图中所有顶点的进出度

给定一个有向图,任务是计算图中每个顶点的入出度。
例子:

Input:

Output:
Vertex    In    Out
0         1    2
1          2    1
2          2    3
3          2    2
4          2    2
5          2    2
6          2    1

方法:遍历每个顶点的邻接列表,如果顶点i的邻接列表的大小为x ,则i = x的出度,并增加每个具有来自i的传入边的顶点的入度。对每个顶点重复这些步骤,最后打印所有顶点的入度和出度。
下面是上述方法的实现:

C++
// C++ program to find the in and out degrees
// of the vertices of the given graph
#include 
using namespace std;
 
// Function to print the in and out degrees
// of all the vertices of the given graph
void findInOutDegree(vector> adjlist,
                     int n)
{
    vector iN(n,0);
      vector ouT(n,0);
 
     
     
    for(int i=0;i> adjlist;
 
    // Vertices 1 and 2 have an incoming edge
    // from vertex 0
    vector tmp;
    tmp.push_back(1);
    tmp.push_back(2);
    adjlist.push_back(tmp);
    tmp.clear();
 
    // Vertex 3 has an incoming edge
    // from vertex 1
    tmp.push_back(3);
    adjlist.push_back(tmp);
    tmp.clear();
 
    // Vertices 0, 5 and 6 have an incoming
    // edge from vertex 2
    tmp.push_back(0);
    tmp.push_back(5);
    tmp.push_back(6);
    adjlist.push_back(tmp);
    tmp.clear();
 
    // Vertices 1 and 4 have an incoming
    // edge from vertex 3
    tmp.push_back(1);
    tmp.push_back(4);
    adjlist.push_back(tmp);
    tmp.clear();
 
    // Vertices 2 and 3 have an incoming
    // edge from vertex 4
    tmp.push_back(2);
    tmp.push_back(3);
    adjlist.push_back(tmp);
    tmp.clear();
 
    // Vertices 4 and 6 have an incoming
    // edge from vertex 5
    tmp.push_back(4);
    tmp.push_back(6);
    adjlist.push_back(tmp);
    tmp.clear();
 
    // Vertex 5 has an incoming
    // edge from vertex 6
    tmp.push_back(5);
    adjlist.push_back(tmp);
    tmp.clear();
 
    int n = adjlist.size();
     
    findInOutDegree(adjlist, n);
}
 
// This code is contributed by saurabhgpta248


Java
// Java program to find the in and out degrees
// of the vertices of the given graph
import java.util.*;
 
class GFG {
 
    // Function to print the in and out degrees
    // of all the vertices of the given graph
    static void findInOutDegree(List > adjList, int n)
    {
        int in[] = new int[n];
        int out[] = new int[n];
 
        for (int i = 0; i < adjList.size(); i++) {
 
            List list = adjList.get(i);
 
            // Out degree for ith vertex will be the count
            // of direct paths from i to other vertices
            out[i] = list.size();
            for (int j = 0; j < list.size(); j++)
 
                // Every vertex that has an incoming
                // edge from i
                in[list.get(j)]++;
        }
 
        System.out.println("Vertex\tIn\tOut");
        for (int k = 0; k < n; k++) {
            System.out.println(k + "\t" + in[k] + "\t" + out[k]);
        }
    }
 
    // Driver code
    public static void main(String args[])
    {
        // Adjacency list representation of the graph
        List > adjList = new ArrayList<>();
 
        // Vertices 1 and 2 have an incoming edge
        // from vertex 0
        List tmp =
           new ArrayList(Arrays.asList(1, 2));
        adjList.add(tmp);
 
        // Vertex 3 has an incoming edge from vertex 1
        tmp = new ArrayList(Arrays.asList(3));
        adjList.add(tmp);
 
        // Vertices 0, 5 and 6 have an incoming
        // edge from vertex 2
        tmp =
          new ArrayList(Arrays.asList(0, 5, 6));
        adjList.add(tmp);
 
        // Vertices 1 and 4 have an incoming edge
        // from vertex 3
        tmp = new ArrayList(Arrays.asList(1, 4));
        adjList.add(tmp);
 
        // Vertices 2 and 3 have an incoming edge
        // from vertex 4
        tmp = new ArrayList(Arrays.asList(2, 3));
        adjList.add(tmp);
 
        // Vertices 4 and 6 have an incoming edge
        // from vertex 5
        tmp = new ArrayList(Arrays.asList(4, 6));
        adjList.add(tmp);
 
        // Vertex 5 has an incoming edge from vertex 6
        tmp = new ArrayList(Arrays.asList(5));
        adjList.add(tmp);
 
        int n = adjList.size();
        findInOutDegree(adjList, n);
    }
}


Python3
# Python3 program to find the in and out
# degrees of the vertices of the given graph
 
# Function to print the in and out degrees
# of all the vertices of the given graph
def findInOutDegree(adjList, n):
     
    _in = [0] * n
    out = [0] * n
 
    for i in range(0, len(adjList)):
 
        List = adjList[i]
 
        # Out degree for ith vertex will be the count
        # of direct paths from i to other vertices
        out[i] = len(List)
        for j in range(0, len(List)):
 
            # Every vertex that has
            # an incoming edge from i
            _in[List[j]] += 1
 
    print("Vertex\tIn\tOut")
    for k in range(0, n):
        print(str(k) + "\t" + str(_in[k]) +
                       "\t" + str(out[k]))
 
# Driver code
if __name__ == "__main__":
     
    # Adjacency list representation of the graph
    adjList = []
 
    # Vertices 1 and 2 have an incoming edge
    # from vertex 0
    adjList.append([1, 2])
 
    # Vertex 3 has an incoming edge from vertex 1
    adjList.append([3])
 
    # Vertices 0, 5 and 6 have an
    # incoming edge from vertex 2
    adjList.append([0, 5, 6])
 
    # Vertices 1 and 4 have an
    # incoming edge from vertex 3
    adjList.append([1, 4])
 
    # Vertices 2 and 3 have an
    # incoming edge from vertex 4
    adjList.append([2, 3])
 
    # Vertices 4 and 6 have an
    # incoming edge from vertex 5
    adjList.append([4, 6])
 
    # Vertex 5 has an incoming edge from vertex 6
    adjList.append([5])
 
    n = len(adjList)
    findInOutDegree(adjList, n)
     
# This code is contributed by Rituraj Jain


C#
// C# program to find the in and out degrees
// of the vertices of the given graph
using System;
using System.Collections.Generic;   
 
class GFG
{
 
// Function to print the in and out degrees
// of all the vertices of the given graph
static void findInOutDegree(List> adjList, int n)
{
    int []iN = new int[n];
    int []ouT = new int[n];
 
    for (int i = 0; i < adjList.Count; i++)
    {
 
        List list = adjList[i];
 
        // Out degree for ith vertex will be the count
        // of direct paths from i to other vertices
        ouT[i] = list.Count;
        for (int j = 0; j < list.Count; j++)
 
            // Every vertex that has an incoming
            // edge from i
            iN[list[j]]++;
    }
 
    Console.WriteLine("Vertex\t\tIn\t\tOut");
    for (int k = 0; k < n; k++)
    {
        Console.WriteLine(k + "\t\t" +
                      iN[k] + "\t\t" + ouT[k]);
    }
}
 
// Driver code
public static void Main(String []args)
{
    // Adjacency list representation of the graph
    List > adjList = new List>();
 
    // Vertices 1 and 2 have an incoming edge
    // from vertex 0
    List tmp =
    new List{1, 2};
    adjList.Add(tmp);
 
    // Vertex 3 has an incoming edge from vertex 1
    tmp = new List{3};
    adjList.Add(tmp);
 
    // Vertices 0, 5 and 6 have an incoming
    // edge from vertex 2
    tmp =
    new List{0, 5, 6};
    adjList.Add(tmp);
 
    // Vertices 1 and 4 have an incoming edge
    // from vertex 3
    tmp = new List{1, 4};
    adjList.Add(tmp);
 
    // Vertices 2 and 3 have an incoming edge
    // from vertex 4
    tmp = new List{2, 3};
    adjList.Add(tmp);
 
    // Vertices 4 and 6 have an incoming edge
    // from vertex 5
    tmp = new List{4, 6};
    adjList.Add(tmp);
 
    // Vertex 5 has an incoming edge from vertex 6
    tmp = new List{5};
    adjList.Add(tmp);
 
    int n = adjList.Count;
    findInOutDegree(adjList, n);
}
}
 
// This code is contributed by 29AjayKumar


输出:
Vertex    In    Out
0    1    2
1    2    1
2    2    3
3    2    2
4    2    2
5    2    2
6    2    1

时间复杂度:O(V + E),其中 V 和 E 分别是图中的顶点数和边数。
辅助空间:O(V + E)。