当前位置:网站首页>图的相关操作
图的相关操作
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;
}
实验结果
主界面
生成邻接矩阵
朋友圈问题
村村通问题
边栏推荐
- Hcip first day experiment
- Li Kai: the interesting and cutting-edge audio and video industry has always attracted me
- Redis source code and design analysis -- 17. Redis event processing
- 实时云渲染有哪些优势
- 越来越成熟的Rust,都应用了哪些场景呢?
- Take you to a preliminary understanding of multiparty secure computing (MPC)
- IDEA集成SVN代码管理常用功能
- 喜讯!瑞云科技被授予“海上扬帆”5G融合应用专委会成员单位
- Redis source code and design analysis -- 15. RDB persistence mechanism
- 2022/7/23
猜你喜欢
Principle and implementation of UDP penetration NAT in P2P

Auditing相关注解

OSPF---开放式最短优先路径协议

Cloud VR: the next step of virtual reality specialization

CVE-2022-33891 Apache spark shell 命令注入漏洞复现

WPF 实现用户头像选择器

大话DevOps监控,团队如何选择监控工具?

Cloud XR面临的问题以及Cloud XR主要应用场景

Thesis reading_ Multi task learning_ MMoE

Redis源码与设计剖析 -- 17.Redis事件处理
随机推荐
[cadence Allegro PCB design] error: possible pin type conflict gnd/vcc power connected to output
Methods of de duplication and connection query in MySQL database
RestTemplate通过泛型实现POST、PUT、DELETE、GET、集合请求以及文件上传(可批量文件、可带参数)的统一封装(可打印日志)
Which futures account is the best and safest
Redis源码与设计剖析 -- 17.Redis事件处理
go defer与recover简单笔记
专访即构科技李凯:音视频的有趣、行业前沿一直吸引着我
Mock服务moco系列(三)- 重定向、正则表达式、延迟、模板、事件、分模块设计
为什么数字化未来取决于3D实时渲染
简述Synchronized以及锁升级
Drawing PDF form (II) drawing excel form style in PDF through iText, setting Chinese font, watermark, logo, header and page number
Interviewer: talk about log The difference between fatal and panic
11. Camera and lens
简述聚簇索引、二级索引、索引下推
SDLC 软件开发生命周期及模型
Sorting also needs to know the information and linked list
Go channel simple notes
期货开户哪家最好最安全
Postman get started quickly
2022/7/23