1.使用邻接矩阵或邻接表表示下面的无向图,并计算图中的总边数。2.使用邻接表和逆邻接表表示有向图,带权值表示。 3.求第1题中V3与V5之间的最短路径。

news/2024/7/15 17:28:10 标签: 数据结构, 算法, 图论

图的应用题

   作为另一种非线性结构—图,它比树更复杂,它的数据元素之间存在多对多的关系,即图中任意一个节点都有多个前驱结点和多个后继结点。图中任意两个结点之间都有可能存在关系,从而可以表达数据元素之间更复杂的关系。

1.使用邻接矩阵或邻接表表示下面的无向图,并计算图中的总边数。
在这里插入图片描述

 //创建无向图
#include <stdio.h>
#include <stdlib.h>
typedef char DataType;
typedef int weight;	/*权值*/
#define MAXVEX 50 	/*最大顶点个数*/
typedef struct {
	weight arcs[MAXVEX][MAXVEX];/*邻接矩阵*/
	DataType data[MAXVEX];/*顶点信息*/
	int vexs;	/*顶点数*/
}MGraph, *AdjMetrix;
//(1)创建邻接矩阵 
void CreateGraph(AdjMetrix g, int m[][MAXVEX], DataType d[], int n) {
	int i, j;
	g->vexs = n;
	for (i = 0; i < n; i++) {
		g->data[i] = d[i];
		for (j = 0; j < n; j++) 	g->arcs[i][j] = m[i][j];
	}
}
//显示邻接矩阵
void DispGraph(AdjMetrix g) {
	int i, j;
	printf("顶点:\n\t");
	for (i = 0; i < g->vexs; i++)
		printf("V%c\t", g->data[i]);
	printf("\n\n邻接矩阵:");
	for (i = 0; i < g->vexs; i++) {
		printf("\nV%c:\t", g->data[i]);
		for (j = 0; j < g->vexs; j++)
			printf("%d\t", g->arcs[i][j]);
	}
	printf("\n\n");
}
int main(int argc, char * argv[]) {
	MGraph gg;
	AdjMetrix g = &gg;
	int pos, i,p,bian;
	char d[] = {'1','2','3','4','5','6'};
	int m[][MAXVEX] = {{0,31,0,0,21,11},{31,0,7,18,0,8},{0,7,0,12,0,0},{0,18,12,0,29,23},{21,0,0,29,0,9},{11,8,0,23,9,0}};
	CreateGraph(g, m, d, 6);
	DispGraph(g);
	for(int q=0;q<=5;q++)
	{
		for(int ml=0;ml<=5;ml++)
		{
			if(m[q][ml]>0)
			p++;
		}
	}
	bian=p/2;
	printf("总边数:%d\n",bian);
		system("pause");
	return 0;
}

2.使用邻接表和逆邻接表表示有向图,带权值表示。
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define MAXVEX 50
#define MAXWEIGHT 100
typedef int DataType ;
typedef struct arc{/*边表结点类型*/   
    int adjvex;/*顶点序号*/ 
    int wt;
    struct arc* next;/*指向下一个邻接点*/
}ArcNode,*PArcNode;
typedef struct{/*顶点表结点类型*/  
    DataType data;/*顶点信息*/  
    ArcNode* head;/*边表头指针*/
}VexNode;
typedef struct{/*邻接表类型*/    
    VexNode lists[MAXVEX];/*顶点表*/   
    int edges,vexs;/*边数,顶点数*/
}VGraph,*AdjList;
void CreateGraph(AdjList *g,int m[][MAXVEX],int n){/*n为顶点总数*/
    int i,j;PArcNode p;
    *g=(AdjList)malloc(sizeof(VGraph));/*初始化邻接表*/
    (*g)->edges=0;  (*g)->vexs=n;
    for(j=0;j<n;j++){
        (*g)->lists[i].head=NULL;   /*边表头指针初始化*/
        for(i=n-1;i>=0;i--)
              if(m[i][j]!=MAXWEIGHT) { /*矩阵元素不为0,则在边表中生成一个结点*/
            p=(PArcNode)malloc(sizeof(ArcNode));
            p->adjvex=i;
            p->next=(*g)->lists[j].head;/*从链表头部插入新结点*/p->wt=m[i][j]; 
            (*g)->lists[j].head=p;(*g)->edges++;
        }
    }
}
void DispGraph(AdjList g){
    int i;
    PArcNode p;
    for(i=0;i<g->vexs;i++){
        printf("\n point %d:\t",i+1);
        p=g->lists[i].head;
        while(p!=NULL){
            printf("\t[%d]\t权值:\t %d",p->adjvex+1,p->wt);
            p=p->next;
        }
    }
}

int main(int argc, char * argv[]) {
	AdjList g;
	int p, i;
	int m[][MAXVEX] = { {MAXWEIGHT,8,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT},{MAXWEIGHT,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT,13},
	{MAXWEIGHT,7,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT},{MAXWEIGHT,18,12,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT},{8,MAXWEIGHT,MAXWEIGHT,6,MAXWEIGHT,MAXWEIGHT} ,{21,MAXWEIGHT,MAXWEIGHT,19,12,MAXWEIGHT}};
	CreateGraph(&g, m, 6);
	printf("\n2:\n");
	DispGraph(g);
	system("pause");
	return 0;
}

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define MAXVEX 50
#define MAXWEIGHT 100
typedef int DataType ;
typedef struct arc{/*边表结点类型*/   
    int adjvex;/*顶点序号*/ 
    int wt;
    struct arc* next;/*指向下一个邻接点*/
}ArcNode,*PArcNode;
typedef struct{/*顶点表结点类型*/  
    DataType data;/*顶点信息*/  
    ArcNode* head;/*边表头指针*/
}VexNode;
typedef struct{/*邻接表类型*/    
    VexNode lists[MAXVEX];/*顶点表*/   
    int edges,vexs;/*边数,顶点数*/
}VGraph,*AdjList;
void CreateGraph(AdjList *g,int m[][MAXVEX],int n){/*n为顶点总数*/
    int i,j;PArcNode p;
    *g=(AdjList)malloc(sizeof(VGraph));/*初始化邻接表*/
    (*g)->edges=0;  (*g)->vexs=n;
    for(i=0;i<n;i++){
        (*g)->lists[i].head=NULL;   /*边表头指针初始化*/
        for(j=n-1;j>=0;j--)
              if(m[i][j]!=MAXWEIGHT) { /*矩阵元素不为0,则在边表中生成一个结点*/
            p=(PArcNode)malloc(sizeof(ArcNode));
            p->adjvex=j;
            p->next=(*g)->lists[i].head;/*从链表头部插入新结点*/p->wt=m[i][j]; 
            (*g)->lists[i].head=p;(*g)->edges++;
        }
    }
}

void DispGraph(AdjList g){
    int i;
    PArcNode p;
    for(i=0;i<g->vexs;i++){
        printf("\n point %d:\t",i+1);
        p=g->lists[i].head;
        while(p!=NULL){
            printf("\t[%d]\t权值:\t %d",p->adjvex+1,p->wt);
            p=p->next;
        }
    }
}

int main(int argc, char * argv[]) {
	AdjList g;
	int p, i;
	int m[][MAXVEX] = { {MAXWEIGHT,8,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT},{MAXWEIGHT,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT,13},
	{MAXWEIGHT,7,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT},{MAXWEIGHT,18,12,MAXWEIGHT,MAXWEIGHT,MAXWEIGHT},{8,MAXWEIGHT,MAXWEIGHT,6,MAXWEIGHT,MAXWEIGHT} ,{21,MAXWEIGHT,MAXWEIGHT,19,12,MAXWEIGHT}};
	CreateGraph(&g, m, 6);
	printf("\n1:\n");
	DispGraph(g);
	system("pause");
	return 0;
}

3.求第1题中V3与V5之间的最短路径。

#include <stdio.h>
#include <stdlib.h>
#define MAXWEIGHT 100
#include<iostream>
using namespace std;
typedef char DataType;
typedef int weight;	/*权值*/
#define MAXVEX 50   /*最大顶点个数*/
typedef int weight; /*权值*/
typedef struct{ 
    weight arcs[MAXVEX][MAXVEX];/*邻接矩阵*/
    DataType data[MAXVEX];/*顶点信息*/  
    int vexs;   /*顶点数*/
}MGraph,*AdjMetrix;

/*下面添加4.2.1小节相关邻接表结构定义、函数和4.2.4小节普里姆算法函数*/
void CreateGraph(AdjMetrix g, int m[][MAXVEX], DataType d[], int n) {
	int i, j;
	g->vexs = n;
	for (i = 0; i < n; i++) {
		g->data[i] = d[i];
		for (j = 0; j < n; j++) 	g->arcs[i][j] = m[i][j];
	}
}


void Prim(AdjMetrix g,int v){
    weight lowcost[MAXVEX];
    int uset[MAXVEX],sum(0);
    int i,j,MinEdge,MinWeight,k;    
    for(i=0;i<g->vexs;i++) { /*初始化lowcost和uset数组*/
           lowcost[i]=g->arcs[v][i];
           uset[i]=1;
    }
    uset[v]=0;              /*把起始点放到最小生成树中*/
    printf("起始点v%c\n",g->data[v]);
   for(i=1;i<g->vexs;i++) {
       MinWeight=MAXWEIGHT;
       for(j=0;j<g->vexs;j++){
           if(uset[j]&&lowcost[j]<MinWeight){/*寻找权值最小的边*/
                MinWeight=lowcost[j];
                MinEdge=j; /*权值最小的边的弧尾顶点*/
           }
       }
        for(j=0;j<g->vexs;j++){/*寻找权值最小的边的弧头顶点*/
            if(g->arcs[j][MinEdge]==MinWeight)
                k=j;
        }
        sum+=MinWeight;
        printf("边(v%c,v%c)\t权值[%d]\n",g->data[k],g->data[MinEdge],MinWeight);
		if(g->data[MinEdge]=='5') {printf("最短路径值:%d",sum);
		break;}  
        uset[MinEdge]=0;/*权值最小的边加入最小生成树*/
        v=MinEdge;
        for(j=0;j<g->vexs;j++){/*更新最小权值*/
            if(uset[j]&&g->arcs[v][j]<lowcost[j])
                lowcost[j]=g->arcs[v][j];
        } 
		    
        
   }
}

int main() {
	MGraph gg;
	AdjMetrix g = &gg;
	int pos, i;
	char d[] = { '1','2','3','4','5','6'};
	int m[][MAXVEX] = { {MAXWEIGHT,31,MAXWEIGHT,MAXWEIGHT,21,11},{31,MAXWEIGHT,7,18,MAXWEIGHT,8},
	{MAXWEIGHT,7,MAXWEIGHT,12,MAXWEIGHT,MAXWEIGHT},{MAXWEIGHT,18,12,MAXWEIGHT,29,23},{21,MAXWEIGHT,MAXWEIGHT,29,MAXWEIGHT,9} ,{11,8,MAXWEIGHT,23,9,MAXWEIGHT}};
	CreateGraph(g, m, d, 6);
	Prim(g,2);
	system("pause");
	return 0;
}

支持可以关注我哦,持续分享编写的代码。


http://www.niftyadmin.cn/n/744654.html

相关文章

Hyperledger Fabric的PBFT源码分析(一)

一、PBFT的原理概述 1.算法公式: replicaCount int 变量定义在pbftCore结构体中 N (N在代码中对应replicaCount整型变量)是所有replicas的集合&#xff0c;每一个replica用一个整数来表示&#xff0c;如{ 0, 1, 2, 3,...N - 1 } N-1 3f -----> f N- 1/3 f 是最大可…

HDU-1009——FatMouse‘ Trade(排序)

原题链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1009 题意&#xff1a;你有m磅猫食&#xff0c;有n间可以用猫食兑换JavaBeans的房间&#xff0c;问能获得的最大JavaBeans。 解题思路&#xff1a;对于没间房间&#xff0c;它都有着一定量的JavaBeans&#x…

1.已知关键字序列{10,80,45,3,65,23,98,8},试用快速排序算法进行排序,并给出每一趟排序结果。 2.已知关键字序列{601,223,417,125,418,391,65,359},

排序的应用题 软件设计中经常遇到排序和查找的问题。而排序和查找的方法也是层出不穷&#xff0c;排序的主要方法有插入排序、交换排序、选择排序、归并排序、堆排序和基数排序。将一组次序任意的数据元素转变为按其关键字值递增&#xff08;或递减&#xff09;次序排列的过程&…

2021年硝化工艺考试及硝化工艺考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2021年硝化工艺考试及硝化工艺考试试卷&#xff0c;包含硝化工艺考试答案和解析及硝化工艺考试试卷练习。由安全生产模拟考试一点通公众号结合国家硝化工艺考试最新大纲及硝化工艺考试真题汇总&#xff0c;有助于硝化…

Java文件上与下载代码-完整代码案例

1. 文件上传与下载 1.1 文件上传 案例&#xff1a; 注册表单/保存商品等相关模块&#xff01; -- 注册选择头像 / 商品图片 (数据库&#xff1a;存储图片路径 /图片保存到服务器中指定的目录) 文件上传&#xff0c;要点: 前台&#xff1a; 1. 提交方式&#xff1a;post…

A. Game 23(思维或dfs或bfs多种解决方案) Codeforces Round #547 (Div. 3)

原题链接&#xff1a;https://codeforces.com/problemset/problem/1141/A 题意&#xff1a;给你一个整数n&#xff0c;可以有两种变化&#xff0c;扩大两倍或扩大三倍&#xff0c;问要经过多少步可以变成m&#xff0c; 若不行&#xff0c;则输出-1. 解题思路&#xff1a;根据…

MATLAB图像处理简单程序(1)—实现几何、算数简单变换,滤镜处理以及图片变换效果展示

1.对tu1、tu2、tu3进行图像合成&#xff0c;利用几何变换、算术运算生成合成图像。&#xff08;要求合成图像的图书馆及湖面合理拼接&#xff0c;天鹅处于湖中&#xff09; ximread(D:\桌面\新建文件夹\tu1.jpg); yimread(D:\桌面\新建文件夹\tu2.jpg); zimread(D:\桌面\新建文…

2021年机械员-通用基础(机械员)考试及机械员-通用基础(机械员)考试平台

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2021年机械员-通用基础(机械员)考试及机械员-通用基础(机械员)考试平台&#xff0c;包含机械员-通用基础(机械员)考试答案和解析及机械员-通用基础(机械员)考试平台练习。由安全生产模拟考试一点通公众号结合国家机械…