zoukankan      html  css  js  c++  java
  • 图的邻接矩阵实现(c)

    参考:算法:c语言实现 一书

    图的邻接矩阵实现

    #ifndef GRAPH
    #define GRAPH
    
    /*
    	图的邻接矩阵实现
    */
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    struct edge{
    	int v;
    	int w;
    };
    
    struct graph{
    	int v;
    	int e;
    	int **adj;
    };
    
    edge EDGE(int v, int w)
    {
    	edge e;
    	e.v = v; e.w = w;
    	return e;
    }
    
    int** matrixInit(int r, int c, int val)
    {
    	int **t = (int**)malloc(r*sizeof(int*));
    	for (int i = 0; i < r; ++i)
    		t[i] = (int*)malloc(c*sizeof(int));
    	for (int i = 0; i < r; ++i)
    		for (int j = 0; j < c; ++j)
    			t[i][j] = val;
    	return t;
    }
    
    graph* graphInit(int v)
    {
    	graph* g = (graph*)malloc(sizeof(graph));
    	g->v = v;
    	g->e = 0;
    	g->adj = matrixInit(v, v, 0);
    	return g;
    }
    
    void graphInsert(graph* g, edge e)
    {
    	int v = e.v, w = e.w;
    	if (g->adj[v][w] == 0) ++g->e;
    	g->adj[v][w] = 1;
    	g->adj[w][v] = 1;
    }
    
    void graphRemove(graph* g, edge e)
    {
    	int v = e.v, w = e.w;
    	if (g->adj[v][w] == 1) --g->e;
    	g->adj[v][w] = 0;
    	g->adj[w][v] = 0;
    }
    
    int graphEdge(graph* g, edge a[])
    {
    	int e = 0;
    	for (int v = 0; v < g->v; ++v)
    		for (int w = 0; w < g->v; ++w)
    			if (g->adj[v][w] == 1)
    				a[e++] = EDGE(v, w);
    	return e;
    }
    
    graph* graphCopy(graph* g)
    {
    	graph *cg = graphInit(g->v);
    	cg->v = g->v;
    	cg->e = g->e;
    	for (int i = 0; i < g->v; ++i)
    		for (int j = 0; j < g->v; ++j)
    			(cg->adj)[i][j] = (g->adj)[i][j];
    	return cg;
    }
    
    void graphDestroy(graph* &g)
    {
    	for (int i = 0; i < g->v; ++i)
    		free((g->adj)[i]);
    	free(g->adj);
    	free(g); 
    }
    
    void graphShow(graph* g)
    {
    	printf("%d vertices, %d edges
    ", g->v, g->e);
    	for (int i = 0; i < g->v; ++i){
    		printf("%2d:", i);
    		for (int j = 0; j < g->v; ++j)
    			if ((g->adj)[i][j] == 1) printf("%2d", j);
    		printf("
    ");
    	}
    }
    
    
    #endif
    

      对各个函数的简单测试:

    #include"graph.h"
    
    int main()
    {
    	printf("	graph of matrix test:
    ");
    	srand(time(NULL));
    	graph* g = graphInit(10);
    	edge e[5];
    	for (int i = 0; i < 5; ++i){
    		e[i].v = rand() % 10;
    		e[i].w = rand() % 10;
    		graphInsert(g, e[i]);
    	}
    	graphShow(g);
    	printf("
    ");
    
    	graph* cg = graphCopy(g);
    	graphDestroy(g);
    	graphRemove(cg, e[1]);
    	graphShow(cg);
    	printf("
    ");
    
    	for (int i = 0; i < 5; ++i)
    		printf("%d: %d
    ", e[i].v, e[i].w);
    	printf("
    ");
    
    	edge ee[10];
    	int cnt=graphEdge(cg, ee);
    	for (int i = 0; i < cnt; ++i)
    		printf("%d,%d
    ", ee[i].v, ee[i].w);
    	printf("
    ");
    
    
    }
    

      

  • 相关阅读:
    20200925--矩阵加法(奥赛一本通P93 6 多维数组)
    20200924--图像相似度(奥赛一本通P92 5多维数组)
    20200923--计算鞍点(奥赛一本通P91 4)
    20200922--计算矩阵边缘元素之和(奥赛一本通P91 3二维数组)
    20200921--同行列对角线的格(奥赛一本通P89 2 二维数组)
    磨人的.net core 3.1(二) DataReader的问题
    磨人的.net core 3.1(一) CORS的问题
    Vue SSR问题:返回的js打包文件为HTML文件
    axios与.net core API实现文件下载
    .Net Core API中基于System.Threading.Timer的定时任务
  • 原文地址:https://www.cnblogs.com/jokoz/p/4755776.html
Copyright © 2011-2022 走看看