9
作者:
xxdmd8
,
2024-12-19 01:11:08
,
所有人可见
,
阅读 7
针对一按照邻接表存放的有向图,计算图中节点的出度和入度。
【问题描述】针对一按照邻接表存放的有向图,计算图中节点的出度和入度。(参照课件上的创建图代码)
【输入形式】
输入图中的顶点个数和边的个数,用空格隔开;如 3 3 表示3个顶点和3条边
输入所有顶点信息——字符型,顶点间用空格隔开;如 a b c 表示3个顶点
输入全部有向边信息——用两个顶点表示边,顶点之间用空格隔开,每条边信息占一行。如:
a b //表示有向边a->b
a c //表示有向边a->c
b c //表示有向边b->c
【输出形式】输出次序与输入的顶点次序一致。每个顶点相关信息的输出占一行,输出信息包括顶点信息,顶点入度,顶点出度,信息之间用空格隔开。如:
a 0 2
b 1 1
c 2 0
【样例输入】
3 3
a b c
a b
a c
b c
【样例输出】
a 0 2
b 1 1
c 2 0
#include<iostream>
#include <unordered_map>
#include <vector>
#include<cstring>
using namespace std;
const int N = 100010;
int n, m;
int h[N],e[N],ne[N],idx;
int inDegree[N],outDegree[N];
unordered_map<char, int> vertexMap;
vector<char> vertices;
void add(int a,int b){
e[idx] = b,ne[idx] = h[a],h[a] = idx ++;
}
int main(){
cin >> n >> m;
char vertex;
for(int i = 0;i < n;i ++){
cin >> vertex;
vertexMap[vertex] = i;
vertices.push_back(vertex);
}
char s,end;
for(int i = 0;i < m;i ++){
cin >> s >> end;
int a = vertexMap[s];
int b = vertexMap[end];
add(a, b);
inDegree[b] ++;
outDegree[a] ++;
}
for(char vertex:vertices){
int index = vertexMap[vertex];
cout << vertex << " " << inDegree[index] << " " << outDegree[index];
cout << endl;
}
return 0;
}