图的经典算法

Posted kirosola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的经典算法相关的知识,希望对你有一定的参考价值。

Prim算法

void Prim(MatGraph g, int v)

	int closet[MAXV];
	int lowcost[MAXV];
	int min;
	int i, j, k;
	for (i = 0; i < g.n; i++)
	
		lowcost[i] = g.edges[v][i];
		closet[i] = v;
	
	for (i = 1; i < g.n; i++)
	
		min = INF;
		for (j = 0; j < g.n; j++)
		
			if (lowcost[j] != 0 && lowcost[j] < min)
			
				min = lowcost[j];
				k = j;
			
		
		lowcost[k] = 0;
		printf("边(%d,%d)权为%d\n", closet[k], k, min);
		for (j = 0; j < g.n; j++)
		
			if (lowcost[j] != 0 && lowcost[j] > g.edges[k][j])
			
				lowcost[j] = g.edges[k][j];
				closet[j] = k;
			
		
	

  Kruskal算法

typedef struct 
	int u;
	int v;
	int w;
Edge;
void Kruskal(MatGraph g)

	int i, j, k;
	int u1, v1;
	int sn1, sn2;
	Edge E[MAXV];
	int vset[MAXV];
	k = 0;
	for (i = 0; i < g.n; i++)
	
		for (j = 0; j <= i; j++)
		
			if (g.edges[i][j] != 0 && g.edges[i][j] != INF)
			
				E[k].u = i;
				E[k].v = j;
				E[k].w = g.edges[i][j];
				k++;
			
		
	
	insert_sort(E, g.e);
	for (i = 0; i < g.n; i++)
		vset[i] = i;
	k = 1;
	j = 0;
	while (k < g.n)
	
		u1 = E[j].u;
		v1 = E[j].v;
		sn1 = vset[u1];
		sn2 = vset[v1];
		if (sn1 != sn2)
		
			printf("(%d,%d):%d\n", u1, v1, E[j].w);
			k++;
			for (i = 0; i < g.n; i++)
			
				if (vset[i] == sn2)
					vset[i] = sn1;
			
		
		j++;
	


  Dijkstra算法(从一个顶点到其余各顶点的最短路径)

void Dijkstral(MatGraph g, int v)

	int i, j, u;
	int mindist;
	int path[MAXV];
	int dist[MAXV];
	int S[MAXV];
	for (i = 0; i < g.n; i++)
	
		S[i] = 0;
		dist[i] = g.edges[v][i];
		if (g.edges[v][i] < INF)
			path[i] = v;
		else
			path[i] = -1;
	
	S[v] = 1;
	path[v] = 0;
	for (i = 1; i < g.n; i++)
	
		mindist = INF;
		for (j = 0; j < g.n; j++)
		
			if (S[j] == 0 && dist[j] < mindist)
			
				u = j;
				mindist = dist[j];
			
		
		S[u] = 1;
		for (j = 0; j < g.n; j++)
		
			if (S[j] == 0)
			
				if (g.edges[u][j] < INF && dist[u] + g.edges[u][j] < dist[j])
				
					dist[j] = dist[u] + g.edges[u][j];
					path[j] = u;
				
			
		
	
	DispPath(g, dist, path, S, v);

void DispPath(MatGraph g, int dist[], int path[], int S[], int v)

  Floyd算法(每对顶点之间的最短路径)

void Floyd(MatGraph g)

	int A[MAXV][MAXV];
	int path[MAXV][MAXV];
	int i, j, k;
	for (i = 0; i < g.n; i++)
	
		for (j = 0; j < g.n; j++)
		
			A[i][j] = g.edges[i][j];
			if (i != j && g.edges[i][j] < INF)
				path[i][j] = i;
			else
				path[i][j] = -1;
		
	
	for (k = 0; k < g.n; k++)
	
		for (i = 0; i < g.n; i++)
		
			for (j = 0; j < g.n; j++)
			
				if (A[i][j] > A[i][k] + A[k][j])
				
					A[i][j] = A[i][k] + A[k][j];
					path[i][j] = path[k][j];
				
			
		
	


void Dispath(MatGraph g, int A[][MAXV], int path[][MAXV])

	int apath[MAXV], d;
	int i, j, k;
	for (i = 0; i < g.n; i++)
	
		for (j = 0; j < g.n; j++)
		
			if (A[i][j] < INF && i != j)
			
				printf("从%d到%d的路径为:", i, j);
				d = 0;
				apath[d] = j;
				k = path[i][j];
				while (k != -1 && k != i)
				
					apath[++d];
					k = path[i][k];
				
				apath[++d] = i;
				printf("%d", apath[d]);
				for (k = d - 1; k >= 0; k--)
					printf(",%d", apath[k]);
				printf("\t路径长度为:%d\n", A[i][j]);
			
		
	

  拓扑排序

typedef struct 
	InfoType info;
	int count;//存放入度
	ArcNode* firstarc;
VNode;
void TopSort(AdjGraph* G)

	int i, j;
	int St[MAXV], top = -1;
	ArcNode* p;
	for (i = 0; i < G->n; i++)
		G->adjlist[i].count = 0;
	for (i = 0; i < G->n; i++)
	
		p = G->adjlist[i].firstarc;
		while (p != NULL)
		
			G->adjlist[p->adjvex].count++;
			p = p->nextarc;
		

	
	for (i = 0; i < G->n; i++)
	
		if (G->adjlist[i].count == 0)
			St[++top] = i;
	
	while (top != -1)
	
		i = St[top--];
		printf("%d ", i);
		p = G->adjlist[i].firstarc;
		while (p != NULL)
		
			G->adjlist[p->adjvex].count--;
			if (G->adjlist[p->adjvex].count == 0)
				St[++top] = p->adjvex;
			p = p->nextarc;
		
		
	

  

以上是关于图的经典算法的主要内容,如果未能解决你的问题,请参考以下文章

拓扑排序((算法竞赛入门经典)刘汝佳)

详细解读目标检测经典算法-SSD

一文通数据结构与算法之——图+常见题型与解题策略+Leetcode经典题

十大经典预测算法----线性回归

数据结构与算法简记--剖析搜索引擎背后的经典数据结构和算法

深入浅出回溯算法