首页 > 其他分享 >有向图

有向图

时间:2023-06-28 22:33:53浏览次数:29  
标签:有向图 dist int graph vexs ++ path

#include <stdio.h>
#define N 20
#define TRUE 1
#define INF 32766
#define INFIN 32767

typedef struct {
	int vexnum, arcnum;
	char vexs[N];
	int arcs[N][N];
} graph;

void createGraph_w(graph *g, int flag);
void dijkstra(graph g, int v);
void printPath(graph g, int startVex, int endVex, int path[]);

// 创建带权有向图的邻接矩阵
void createGraph_w(graph *g, int flag) {
	char s;
	int i = 0, j, t, w, num = 0;
	for (int a = 0; a < N; a++)
		for (int b = 0; b < N; b++)
			g->arcs[a][b] = INFIN;
	for (int c = 0; c < N; c++)
		g->arcs[c][c] = 0;
	s = getchar();
	while (s != '#') {
		g->vexs[i] = s;
		i++;
		s = getchar();
	}
	getchar();
	g->vexnum = i;
	scanf("%d,%d,%d", &j, &t, &w);
	while (j != -1 && t != -1 && w != -1) {
		g->arcs[j][t] = w;
		num++;
		scanf("%d,%d,%d", &j, &t, &w);
	}
	g->arcnum = num;
}

// 根据 Dijkstra 算法计算出的最短路径,输出最短路径
void printPath(graph g, int startVex, int EndVex, int path[]) {
	if (startVex == EndVex) {
		printf("%c", g.vexs[startVex]);
		return;
	}

	if (path[EndVex] == -1) {
		printf("no path from %c to %c", g.vexs[startVex], g.vexs[EndVex]);
		return;
	}

	printPath(g, startVex, path[EndVex], path);
	printf("-->%c", g.vexs[EndVex]);
}

// Dijkstra 算法求单源最短路径
void dijkstra(graph g, int v) {
	int i, j, k;
	int dist[N];
	int path[N];
	int visited[N];

	for (i = 0; i < g.vexnum; i++) {
		dist[i] = g.arcs[v][i];
		visited[i] = 0	;

		if (dist[i] < INF && dist[i] > 0) {
			path[i] = v;
		} else {
			path[i] = -1;
		}
	}

	visited[v] = TRUE;
	dist[v] = 0;

	for (i = 1; i < g.vexnum; i++) {
		int min = INF;

		for (j = 0; j < g.vexnum; j++) {
			if (!visited[j] && dist[j] < min) {
				min = dist[j];
				k = j;
			}
		}

		visited[k] = TRUE;

		for (j = 0; j < g.vexnum; j++) {
			if (!visited[j] && g.arcs[k][j] < INF) {
				int newdist = dist[k] + g.arcs[k][j];

				if (newdist < dist[j]) {
					dist[j] = newdist;
					path[j] = k;
				}
			}
		}
	}

	for (i = 0; i < g.vexnum; i++) {
		if (i != v) {
			printf("%c->%c:", g.vexs[v], g.vexs[i]);
			printPath(g, v, i, path);
			printf("\n");
		}
	}
}

int main() {
	graph g;
	int k;
	createGraph_w(&g, 0);
	scanf("%d", &k);
	dijkstra(g, k);
	return 0;
}

标签:有向图,dist,int,graph,vexs,++,path
From: https://blog.51cto.com/u_16030624/6577032

相关文章

  • 数据结构代码整理_基于邻接表存储结构的有向图的实现(C++)
    目录RequirementsDebuggingEnvironmentChatCode1.graph.h2.test.cppRequirements       基于邻接表存储结构实现有向图的典型操作(构造、析构、增加顶点、删除顶点、增加弧、删除弧,查找一个顶点、判空、判满、图中顶点个数、邻接表中指定顶点的第一个邻接顶点、深度优先......
  • 有向图 dp
    1.1什么是有向图dp我们遇到的博弈问题,例如【省选联考2023】过河卒,很多都是转化为有向图博弈,其形如:一些节点为终止节点,状态已经确定;一个点的状态由其出边所到达点的状态确定。如果是DAG上,显然我们可以按照拓扑序让每个点搜索到的时候其所有出边都已经确定了状态。但是题目有......
  • 有向图的拓扑序列
    #include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=1e5+10;intn,m;inth[N],e[N],ne[N],idx;intd[N];//入线intq[N];voidadd(inta,intb){e[idx]=b;ne[idx]=h[a];h[a]=idx++;}boolto......
  • 2023-04-09 有向图及相关算法
    有向图及相关算法1有向图的实现有向图的的应用场景社交网络中的关注互联网连接程序模块的引用任务调度学习计划食物链论文引用无向图是特殊的有向图,即每条边都是双向的改进Graph和WeightedGraph类使之支持有向图Graph类的改动WeightedGraph类的改动2有向图算......
  • 848. 有向图的拓扑序列
    https://www.acwing.com/problem/content/850/#include<bits/stdc++.h>usingnamespacestd;constintN=100010;vector<int>p[N];//vector变长数组来写邻接表queue<int>q;//队列操作intd[N];//统计入度intn,m,cnt,ans[N];//ans数组记......
  • 【NOIP2015】【Vijos1979】信息传递(有向图最小环大小)
    problem给定一张n个点,n条边的有向图求图的最小环,输出大小solutionkosaraju暴力求出所有强连通分量,取最小值即可codes//kosaraju#include<iostream>#include<al......
  • tarjan求有向图强连通分量
    tarjan算法的简单应用hdu1269题目链接题意给定有向图,问改有向图是否只有一个强连通分量思路tarjan算法求有向图强连通分量的简单应用代码#include<iostream>......
  • Solution 题解 UVA1389 Hard Life: 最小割,有向图,分数规划,和牛顿迭代
    题解UVA1389HardLife:最小割,有向图,分数规划,和牛顿迭代Preface黑题好耶看到了题解里面大多数是二分,我就来讲一讲简单又快速的DinkelbachAlgorithm吧!0-1分数规划......
  • 有向图的拓扑排序——DFS
    在有向图的拓扑排序——BFS这篇文章中,介绍了有向图的拓扑排序的定义以及使用广度优先搜索(BFS)对有向图进行拓扑排序的方法,这里再介绍另一种方法:深度优先搜索(DFS)。算法考虑......
  • 【数据结构】五分钟带你了解及自定义有向图
    前言什么是有向图在数学中,一个图(Graph)是表示物件与物件之间的关系的方法,是图论的基本研究对象。一个图看起来是由一些小圆点(称为顶点或结点)和连结这些圆点的直线或曲线(......