针对一按照邻接表存放的有向图,计算图中节点的出度和入度
【问题描述】
针对一按照邻接表存放的有向图,计算图中节点的出度和入度。(参照课件上的创建图代码)
【输入形式】
输入图中的顶点个数和边的个数,用空格隔开;如 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
C++代码
#include<iostream>
using namespace std;
struct edgenode { //边表节点
int adjvertex; //邻接点的下标
edgenode* next;
};
struct vertexnode {
char vertex; //顶点数据域
edgenode* firstedge; //指向边表第一节点
};
struct AMgraph {
vertexnode vertlist[100]; //邻接表
int n, e; //nodes' count, edges' count
};
AMgraph* Creategraph() {
AMgraph* g = new AMgraph;
cin >> g->n >> g->e;
for (int i = 0; i < g->n; i++) {
cin >> g->vertlist[i].vertex;
g->vertlist[i].firstedge = NULL;
}
char head, tail;
int adjhead, adjtail;
for (int i = 0; i < g->e; i++) {
cin >> head >> tail;
for (int j = 0; j < g->n; j++) { //找顶点下标
if (g->vertlist[j].vertex == head) adjhead = j;
if (g->vertlist[j].vertex == tail) adjtail = j;
}
edgenode* p = new edgenode;
p->adjvertex = adjtail;
p->next = g->vertlist[adjhead].firstedge; //头插法
g->vertlist[adjhead].firstedge = p;
}
return g;
}
int OutDegree(AMgraph* g,int n) { //输出顶点n的出度
int cnt = 0;
edgenode* p = g->vertlist[n].firstedge;
while (p) {
cnt++;
p = p->next;
}
return cnt;
}
int InDegree(AMgraph* g, int n) { //输出顶点n的入度
int cnt = 0;
for (int i = 0; i < g->n; i++) {
edgenode* p = g->vertlist[i].firstedge;
while (p) {
if (p->adjvertex == n)
cnt++;
p = p->next;
}
}
return cnt;
}
int main() {
AMgraph* g = Creategraph();
for (int i = 0; i < g->n; i++)
cout << g->vertlist[i].vertex << " " << InDegree(g, i) << " " << OutDegree(g, i) << endl;
return 0;
}