【问题描述】
给定一个无向图,编程输出该图第k个顶点的第1邻接点。
图的顶点个数n大于等于3,小于等于50,输入时顶点编号用整数1~n表示;相邻顶点按照编号从小到大的顺序。
【输入形式】
先从标准输入中输入图的顶点个数和边的个数,两整数之间以一个空格分隔,然后从下一行开始分行输入每条边的信息(用边两端的顶点编号表示一条边,以一个空格分隔顶点编号,边的输入次序和每条边两端顶点编号的输入次序可以是任意的,但边不会重复输入),最后在新的一行上输入第k个顶点编号。
如下图:5个顶点6条边
【样例输入】
5 6
1 2
1 4
2 3
2 5
3 4
3 5
5
【样例输出】
2
【样例说明】
输入的无向图共有5个顶点,6条边(如图所示),需求第5个顶点的第一邻接点。
输出结果为2.
【运行结果如下】
【代码如下】
#include<stdio.h>
#define MVNum 40 //最大顶点个数
//------图的的数组(邻接矩阵)存储表示------
typedef struct {
int vexs[MVNum]; //顶点向量
int arcs[MVNum][MVNum]; //邻接矩阵
int visited[MVNum]; //访问标志数组
int vexnum; //顶点数
int arcnum; //弧数
}MGraph;
int LocateVex(MGraph &G,int v)
{
for (int i = 0; i < G.vexnum; i++)
if (G.vexs[i] == v) return i;
return -1;
}
void CreateUDG(MGraph &G)
{
//构造无向图G
int i, j, k;
int v1, v2;
scanf("%d %d",&G.vexnum,&G.arcnum); //顶点总数和弧总数
for (i = 0; i < G.vexnum; i++){
G.vexs[i] = i+1; //构造顶点向量
G.visited[i] = 0; //初始化标记数组
}
for (i = 0; i < G.vexnum; i++)//初始化邻接矩阵
for (j = 0; j < G.vexnum; j++)
G.arcs[i][j] = 0;
for (k = 0; k < G.arcnum; k++){//构造邻接矩阵
scanf("%d %d",&v1,&v2);
i = LocateVex(G,v1);
j = LocateVex(G,v2);
G.arcs[i][j] = 1;
G.arcs[j][i] = 1;
}//for
}
int FirstAdjVex(MGraph G, int v)
{
for(int j = 0 ; j < G.vexnum; j++)
if(G.arcs[v][j] == 1 && G.visited[j] == false)
return j;
return -1;
}
int main()
{
int vex;
MGraph G;
CreateUDG(G);
scanf("%d",&vex); //输入第k个顶点
printf("%d\n",FirstAdjVex(G,vex-1)+1);
return 0;
}
本文章仅供学习和参考!
欢迎交流~