⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bmst.c

📁 生成直角Steiner树的程序包
💻 C
字号:
/***********************************************************************	File:	bmst.c	Rev:	b-1	Date:	02/28/2001	Copyright (c) 1997, 2001 by David M. Warme & Martin Zachariasen************************************************************************	Routines to compute Minimum Spanning Trees using the	Bottleneck Steiner Distance.************************************************************************	Modification Log:	a-1:	09/04/97	warme		: Created.	b-1:	02/28/2001	martinz		: Added new procedures "bmst" and "bmst_terms" that		: return the edges of the MST (instead of only the		: length)************************************************************************/#include "bsd.h"#include "steiner.h"/* * Global Routines */dist_t			bmst_length (struct pset *, struct bsd *);int			bmst (struct pset *, struct bsd *, struct edge *);dist_t			bmst_terms_length (int *, int, struct bsd *);int			bmst_terms (int *, int, struct bsd *, struct edge *);/* * External References */	/* none *//* * This routine computes the length of a Minimum Spanning Tree for * the given point set as measured using the Bottleneck Steiner Distance. */	dist_tbmst_length (struct pset *		pts,		/* IN - point set */struct bsd *		bsdp		/* IN - BSD data structure */){int		i;int		nedges;struct edge *	ep;struct edge *	edges;dist_t		total;	edges = NEWA (pts -> n - 1, struct edge);	nedges = bmst (pts, bsdp, &edges [0]);	if (nedges NE pts -> n - 1) {		fatal ("bmst_length: bug 1.");	}	total = 0;	ep = edges;	for (i = 0; i < nedges; i++, ep++) {		total += ep -> len;	}	free ((char *) edges);	return (total);}/* * This routine computes a Minimum Spanning Tree for * the given point set as measured using the Bottleneck Steiner Distance. */	intbmst (struct pset *		pts,		/* IN - point set */struct bsd *		bsdp,		/* IN - BSD data structure */struct edge *		edges		/* OUT - edge list */){int		i;int		j;int		n;int		nedges;int		mst_edge_count;struct point *	p1;struct point *	p2;struct edge *	ep;struct edge *	edge_array;	n	= pts -> n;	nedges	= (n * (n - 1)) >> 1;	edge_array = NEWA (nedges, struct edge);	ep = edge_array;	p1 = &(pts -> a [0]);	for (i = 0; i < n; i++, p1++) {		p2 = p1 + 1;		for (j = i + 1; j < n; j++, p2++) {			ep -> len	= bsd (bsdp, p1 -> pnum, p2 -> pnum);			ep -> p1	= ((pnum_t) i);			ep -> p2	= ((pnum_t) j);			++ep;		}	}	mst_edge_count = mst_edge_list (n, nedges, &edge_array [0], edges);	free ((char *) edge_array);	return (mst_edge_count);}/* * This routine computes the length of a Minimum Spanning Tree for * the given list of terminals as measured using the * Bottleneck Steiner Distance. */	dist_tbmst_terms_length (int *			terms,		/* IN - array of terminal numbers */int			n,		/* IN - number of terminals */struct bsd *		bsdp		/* IN - BSD data structure */){int		i;int		nedges;struct edge *	ep;struct edge *	edges;dist_t		total;	edges = NEWA (n - 1, struct edge);	nedges = bmst_terms (terms, n, bsdp, edges);	if (nedges NE n - 1) {		fatal ("bmst_terms_length: bug 1.");	}	total = 0;	ep = edges;	for (i = 0; i < nedges; i++, ep++) {		total += ep -> len;	}	free ((char *) edges);	return (total);}/* * This routine computes a Minimum Spanning Tree for * the given list of terminals as measured using the * Bottleneck Steiner Distance. */	intbmst_terms (int *			terms,		/* IN - array of terminal numbers */int			n,		/* IN - number of terminals */struct bsd *		bsdp,		/* IN - BSD data structure */struct edge *		edges		/* OUT - edge list */){int		i;int		j;int		t;int		nedges;int		mst_edge_count;int *		ip;int *		jp;struct edge *	ep;struct edge *	edge_array;	nedges	= (n * (n - 1)) >> 1;	edge_array = NEWA (nedges, struct edge);	ep = edge_array;	ip = &terms [0];	for (i = 0; i < n; i++, ip++) {		t = *ip;		jp = ip + 1;		for (j = i + 1; j < n; j++, jp++) {			ep -> len	= bsd (bsdp, t, *jp);			ep -> p1	= ((pnum_t) i);			ep -> p2	= ((pnum_t) j);			++ep;		}	}	mst_edge_count = mst_edge_list (n, nedges, &edge_array [0], edges);	free ((char *) edge_array);	return (mst_edge_count);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -