一、邻接矩阵实现
假设不带权有向图采用邻接矩阵 g 存储,设计实现以下功能的算法:
(1) 求出图中每个顶点的入度。
(2) 求出图中每个顶点的出度。
(3) 求出图中出度为0 的顶点数。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define INFINITY 65535
#define MAX_VERTEX_NUM 100
typedef char VertexType;
typedef struct {
VertexType vexs[MAX_VERTEX_NUM]; //顶点数组
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵
int v, e; //图顶点和边的数量
} MGraph;
int num=0; 全局变量负责统计出度为0的顶点个数
void CreateMGraph(MGraph &G)
{
int i,j,k,w;
printf("输入顶点数和边数:\n");
scanf("%d%d",&G.v,&G.e);
//for(i=0;i<G.v;i++)
//scanf("%c",G.vexs[i]);
for(i=0;i<G.v;i++)
for(j=0;j<G.v;j++)
G.arcs[i][j]=INFINITY; //初始化邻接矩阵
for(k=0;k<G.e;k++)
{
printf("输入边(i,j)上的下标i,j和权w\n");
scanf("%d%d%d",&i,&j,&w);
G.arcs[i][j]=w;
}
}
void indu(MGraph G)
{
int n=0;
printf("入度:\n");
for(int i=0;i<G.v;i++)
{
for(int j=0;j<G.v;j++)
{
if(G.arcs[j][i]!=INFINITY)
n++;
}
printf("%d ",n);
n=0;
}
}
void outdu(MGraph G) //要不要加引用,有时候需要仔细考虑一下
{
int n=0;
printf("出度:\n");
for(int i=0;i<G.v;i++)
{
for(int j=0;j<G.v;j++)
{
if(G.arcs[i][j]!=INFINITY)
n++;
}
if(n==0)
num++;
printf("%d ",n);
n=0;
}
}
int main()
{
MGraph G;
CreateMGraph(G);
indu(G);
printf("\n");
outdu(G);
printf("\n");
printf("出度为0的顶点个数:%d",num);
return 0;
}
二、邻接表
假设不带权有向图采用邻接表 G 存储,设计实现以下功能的算法:
(1)求出图中每个顶点的入度。
(2)求出图中每个顶点的出度。
(3)求出图中出度为0 的顶点数。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define INFINITY 65535
#define MAX_VERTEX_NUM 100
typedef int VertexType;
int num=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;
printf("输入顶点数和边数:\n");
scanf("%d%d",&G.v,&G.e);
for(i=0;i<G.v;i++)
{
//scanf("%d",&G.adjlist[i].data);
G.adjlist[i].firstarc=NULL;
}
for(k=0;k<G.e;k++)
{
printf("输入边(vi,vj)上的顶点序号:\n");
scanf("%d%d",&i,&j);
e=(ArcNode*)malloc(sizeof(ArcNode));
e->adjvex=j;
e->nextarc=G.adjlist[i].firstarc;
G.adjlist[i].firstarc=e;
/*e=(ArcNode*)malloc(sizeof(ArcNode));
e->adjvex=i;
e->nextarc=G.adjlist[j].firstarc;
G.adjlist[j].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]++;
e=G.adjlist[j].firstarc->nextarc;
G.adjlist[j].firstarc=e;
}
}
for(i=0;i<G.v;i++)
printf("%d ",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;
}