题目
统计有向图的入度和出度,并统计出度为0的顶点个数的算法
该题目使用邻接表实现
代码
#include <stdlib.h>
#include <iostream>
using namespace std;
#define INFINITY 65535
#define MAX_VERTEX_NUM 100
typedef int VertexType;
int num=0; //出度为0的顶点个数
//边表
typedef struct ArcNode {
int adjvex; //邻接顶点的标号
int weight; //权重
ArcNode *nextarc;
} ArcNode;
//顶点数组
typedef struct {
VertexType data; //VertexType可以写成结构体类型存储信息
ArcNode *firstarc;
} VNode;
typedef struct {
VNode adjlist[MAX_VERTEX_NUM];
int v, e; //顶点个数和边的个数
} ALGraph;
void CreateALGraph(ALGraph &G) //创建邻接表
{
int i,j,k;
ArcNode *e;
cout<<"输入顶点数和边数:"<<endl;
cin>>G.v>>G.e;
cout<<G.v<<" "<<G.e<<" "<<endl;
//初始化顶点数组
for(i=0;i<G.v;i++)
{
G.adjlist[i].firstarc=NULL;
}
for(k=0;k<G.e;k++)
{
cout<<"输入边(vi,vj)上的顶点序号:"<<endl;
cin>>i>>j;
cout<<i<<" "<<j<<" "<<endl;
e=(ArcNode*)malloc(sizeof(ArcNode)); //使用头插法进行插入
e->adjvex=j;
e->nextarc=G.adjlist[i].firstarc;
G.adjlist[i].firstarc=e;
}
}
void indu(ALGraph G)
{
int i,j,n=0;
int A[G.v];//存放每一顶点的入度
//初始化数组
for(i=0;i<G.v;i++)
A[i]=0;
ArcNode *e;
for(j=0;j<G.v;j++)
{
while(G.adjlist[j].firstarc!=NULL)
{
A[G.adjlist[j].firstarc->adjvex]++;//(a,b)说明b的入度加一
e=G.adjlist[j].firstarc->nextarc;
G.adjlist[j].firstarc=e;
}
}
for(i=0;i<G.v;i++)
cout<<A[i]<<" ";
}
void outdu(ALGraph G)
{
int n=0,i=0;
ArcNode *e;
for(i=0;i<G.v;i++)
{
while(G.adjlist[i].firstarc!=NULL)
{
n++;
e=G.adjlist[i].firstarc->nextarc;
G.adjlist[i].firstarc=e;
}
if(n==0)
num++;
printf("%d ",n);
n=0;
}
}
int main()
{
ALGraph G;
CreateALGraph(G);
printf("出度:");
outdu(G);
printf("\n");
printf("入度:");
indu(G);
printf("\n");
printf("出度为0的节点数\n");
printf("%d\n",num);
return 0;
}