当前位置:网站首页>图的相关操作
图的相关操作
2022-07-25 17:58:00 【心を見て心をほれる】
前言
题目要求:
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;
}
实验结果
主界面
生成邻接矩阵
朋友圈问题
村村通问题
边栏推荐
猜你喜欢

Update 3dcat real time cloud rendering V2.1.2 release

Idea 必备插件

Hcip first day experiment

I'm also drunk. Eureka delayed registration and this pit!

面试官:说说 log.Fatal 和 panic 的区别

Cloud VR: the next step of virtual reality specialization

交友活动记录

十九岁的总结

Li Kai: the interesting and cutting-edge audio and video industry has always attracted me

How to fix the first row title when scrolling down in Excel table / WPS table?
随机推荐
“Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0”问题解决
OSPF---开放式最短优先路径协议
Itextpdf realizes the merging of multiple PDF files into one PDF document
Nineteen year old summary
Mock服务moco系列(三)- 重定向、正则表达式、延迟、模板、事件、分模块设计
云流化和云桌面有什么关系
Drawing PDF form (II) drawing excel form style in PDF through iText, setting Chinese font, watermark, logo, header and page number
ORB_SLAM3复现——上篇
Li Kai: the interesting and cutting-edge audio and video industry has always attracted me
Redis源码与设计剖析 -- 17.Redis事件处理
HCIP第一天实验
Redis源码与设计剖析 -- 15.RDB持久化机制
自动化测试 PO设计模型
Cloud VR: the next step of virtual reality specialization
SDLC software development life cycle and model
交友活动记录
Cross validation (CV) learning notes
What is an IP SSL certificate and how to apply for it?
OSPF --- open shortest priority path protocol
什么是 IP SSL 证书,如何申请?