查找图中所有顶点的进出度
给定一个有向图,任务是计算图中每个顶点的入出度。
例子:
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)。