POJ 2421 Constructing Roads

题目大意:

        与POJ 1751 Highways类同,只不过3 ≤ N ≤ 100,各点之间的距离有矩阵输入,任意两点之间距离范围为[1, 1000],0 ≤ M ≤ N(N+1)/2,只有一个测例,只要求输出新建路的总长度即可。

题目链接

代码:

/*                                    
 * Problem ID : POJ 2421 Constructing Roads
 * Author     : Lirx.t.Una                                    
 * Language   : C++                        
 * Run Time   : 32 ms                                    
 * Run Memory : 196 KB                                    
*/

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>

#define	MAXN	100

using namespace std;

struct	Node {

	short	u;
	short	d;

	Node(void) {}

	Node(int uu, int dd) : u(uu), d(dd) {}

	bool
	operator<(const Node &oth)
	const {

		return d > oth.d;
	}
};

short	g[MAXN + 1][MAXN + 1];
short	d[MAXN + 1];
bool	vis[MAXN + 1];

priority_queue<Node>	heap;

int
prim(int n) {

	int		i;
	int		nv;

	int		u, v;
	
	int		ans;

	Node	node;

	vis[1] = true;
	for ( i = 2; i <= n; i++ ) {
	
		d[i]   = g[1][i];
		heap.push(Node( i, d[i] ));
	}

	ans = 0;
	nv  = 1;
	while ( !heap.empty() ) {
	
		while (true) {
		
			node = heap.top();
			heap.pop();

			if ( !vis[ u = node.u ] ) {
			
				vis[u] = true;
				nv++;
				ans += node.d;

				break;
			}
		}

		if ( nv == n ) break;

		for ( v = 2; v <= n; v++ )
			if ( !vis[v] && g[u][v] < d[v] ) {

				d[v]   = g[u][v];
				heap.push(Node( v, d[v] ));
			}
	}

	return ans;
}

int
main() {

	int		n, m;
	int		u, v;
	int		i, j;

	scanf("%d", &n);
	for ( i = 1; i <= n; i++ )
		for ( j = 1; j <= n; j++ )
			scanf("%d", &g[i][j]);

	scanf("%d", &m);
	while ( m-- ) {
	
		scanf("%d%d", &u, &v);
		g[u][v] = g[v][u] = 0;
	}

	printf("%d\n", prim(n));

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值