前言
题目要求:
1.根据输入,使用邻接矩阵的数据;
2.实现图的深度优先或广度优先遍历。
3.朋友圈问题
4.村村通问题
提示:以下是本篇文章正文内容,下面案例可供参考
完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <malloc.h>
#define Maxvex 100
typedef char VertexType;
typedef int EdgeType;
int visited[Maxvex];
//定义图结构体
typedef struct MGraph {
VertexType vexs[Maxvex];
EdgeType arc[Maxvex][Maxvex];
int numvex, numedg;
}MGraph;
//定义队列
typedef struct Queue {
int data[Maxvex];
int head,tail;
}Queue;
//初始化队列
void BeQueue(Queue *Q){
Q->head=Q->tail=0;
}
//入队
void InQueue(Queue *Q,int i){
Q->data[Q->tail]=i;
Q->tail=(Q->tail+1)%Maxvex;
}
//出队
void OutQueue(Queue *Q,int *i){
*i=Q->data[Q->head];
Q->head=(Q->head+1)%Maxvex;
}
//判断队列是否为空
int Judge(Queue *Q){
if(Q->head==Q->tail){
return 1;
}
else{
return 0;
}
}
//建立邻接图
void CreateMGraph(MGraph* G) {
int i, j, k, w;
printf("输入顶点数和边数:\n");
scanf("%d%d", &G->numvex, &G->numedg);
getchar();//清空缓存区
printf("输入各个顶点:\n");
for (i = 0;i < G->numvex;i++){
printf("顶点%d:",i+1);
scanf("%c",&G->vexs[i]);
getchar();//清空缓存区
}
for (i = 0;i < G->numvex;i++) {
for (j = 0;j < G->numvex;j++) {
G->arc[i][j] = 0;//给权值赋初值0
}
}
for (k = 0;k < G->numedg;k++) {
printf("输入边(vi,vj)的上标i,下标j和权值w\n");
scanf("%d%d%d", &i, &j,&w);
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j];
}
}
//建立人际关系
void CreateFriend(MGraph* R) {
int i, j, k;
printf("输入人数和关系边数:\n");
scanf("%d%d", &R->numvex, &R->numedg);
getchar();//清空缓存区
printf("输入人的代号:\n");
for (i = 0;i < R->numvex;++i){
printf("人%d:",i+1);
scanf("%c",&R->vexs[i]);
getchar();//清空缓存区
}
for (i = 0;i < R->numvex;i++) {
for (j = 0;j < R->numvex;j++) {
R->arc[i][j] = 0;//给权值赋初值0
}
}
for (k = 0;k < R->numedg;k++) {
printf("输入人(vi,vj)的上标i,下标j\n");
scanf("%d%d", &i, &j);
R->arc[i][j] = 1;
R->arc[j][i] = R->arc[i][j];
}
}
//建立村际关系
void CreateCountryside(MGraph* C) {
int i, j, k, w;
printf("输入村数和连通道路数:\n");
scanf("%d%d", &C->numvex, &C->numedg);
getchar();//清空缓存区
for (i = 1;i <= C->numvex;i++) {
for (j = 1;j <= C->numvex;j++) {
C->arc[i][j] = 0;//给权值赋初值0
}
}
for (k = 1;k <= C->numedg;k++) {
printf("输入村路(vi,vj)的上标i,下标j和权值w\n");
scanf("%d%d%d", &i, &j,&w);
C->arc[i][j] = w;
C->arc[j][i] = C->arc[i][j];
}
}
//打印邻接图
void print(MGraph* G) {
int i, j;
printf("邻接图为:\n");
for (i = 0;i < G->numvex;i++) {
for (j = 0;j < G->numvex;j++) {
printf("%d\t", G->arc[i][j]);
}
printf("\n");
}
}
//打印人际关系图
void printF(MGraph* R) {
int i, j;
printf("人际关系图为:\n");
for (i = 0;i < R->numvex;i++) {
for (j = 0;j < R->numvex;j++) {
printf("%d\t", R->arc[i][j]);
}
printf("\n");
}
}
//打印村关系图
void printC(MGraph* G) {
int i, j;
printf("村关系图为:\n");
for (i = 1;i <= G->numvex;i++) {
for (j = 1;j <= G->numvex;j++) {
printf("%d\t", G->arc[i][j]);
}
printf("\n");
}
}
//深度搜索
void DFS(MGraph G, int i) {
int j;
visited[i] = 1;
printf("%c", G.vexs[i]);
for (j = 0;j < G.numvex;j++) {
if (G.arc[i][j] !=0 && !visited[j]) {
DFS(G, j);
}
}
}
void DFST(MGraph G){
int i;
for(i=0;i<G.numvex;++i){
visited[i]=0;
}
for(i=0;i<G.numvex;++i){
if(!visited[i]){
DFS(G,i);
}
}
}
//宽度搜索
void BFS(MGraph *G){
Queue Q;
int i,j;
for(i=0;i<G->numvex;i++){
visited[i]=0;
}
BeQueue(&Q);
for(i=0;i<G->numvex;i++){
visited[i]=1;
printf("%c",G->vexs[i]);
InQueue(&Q,i);
while(!Judge(&Q)){
OutQueue(&Q,&i);
for(j=0;j<G->numvex;j++){
if(!visited[j]&&G->arc[i][j]!=0){
visited[j]=1;
printf("%c",G->vexs[j]);
InQueue(&Q,j);
}
}
}
}
printf("\n");
}
//求有几个朋友圈
void DFSF(MGraph R, int i) {
int j;
visited[i] = 1;
for (j = 0;j < R.numvex;j++) {
if (R.arc[i][j] !=0 && !visited[j]) {
DFSF(R, j);
}
}
}
void DFSTF(MGraph R){
int i,c=0;
for(i=0;i<R.numvex;++i){
visited[i]=0;
}
for(i=0;i<R.numvex;++i){
if(!visited[i]){
DFSF(R,i);
c++;
}
}
printf("%d个人共有%d个朋友圈\n",R.numvex,c);
}
//普里姆算法
void Prim(MGraph C){
int min,i,j,k,L=0;
int adjvex[Maxvex];
int lowcost[Maxvex];
adjvex[1]=1;
lowcost[0]=0;
for(i=2;i<=C.numvex;i++){
lowcost[i]=C.arc[1][i];
adjvex[i]=1;
}
for(i=2;i<=C.numvex;i++){
min=1000000;
j=2;k=1;
while(j<=C.numvex){
if(lowcost[j]!=0&&lowcost[j]<min){
min=lowcost[j];
k=j;
}
j++;
}
if(min!=1000000)
L=L+min;
lowcost[k]=0;
for(j=2;j<=C.numvex;j++){
if(lowcost[j]!=0&&C.arc[k][j]<lowcost[j]){
lowcost[j]=C.arc[k][j];
adjvex[j]=k;
}
}
}
printf("%d\n",L);
}
//朋友圈问题
void Friend(){
MGraph R;
CreateFriend(&R);
printF(&R);
DFSTF(R);
}
//村村通问题
void Countryside(){
MGraph C;
CreateCountryside(&C);
printC(&C);
Prim(C);
}
int function(){
int choose=-1;
printf("1、创建图\n");
printf("2、深度优先遍历\n");
printf("3、广度优先遍历\n");
printf("4、朋友圈问题\n");
printf("5、村村通问题\n");
printf("0、退出\n");
while(choose!=0){
printf("请选择:\n");
scanf("%d", &choose);
switch(choose){
case 1:
MGraph G;
CreateMGraph(&G);
print(&G);
break;
case 2:
printf("图的深度遍历为:\n");
DFST(G);
printf("\n");
break;
case 3:
printf("图的广度遍历为:\n");
BFS(&G);
break;
case 4:
Friend();
break;
case 5:
Countryside();
break;
}
}
}
int main() {
function();
return 0;
}
实验结果
主界面
生成邻接矩阵
朋友圈问题
村村通问题