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

📄 1258.txt

📁 北大ACM题目例程 详细的解答过程 程序实现 算法分析
💻 TXT
字号:


#include<stdio.h>
#include<vector>
#include<string.h>

using namespace std;

const int size = 1000;
typedef int type;
type e[size][size];


////////////////////////////////////////////////////////////////
//prim
//
//O(n^n)
//
//e为边权矩阵( < 0 表示边不存在 ),n为节点个数
//
//f返回每个节点在最小生成树中的父亲,( 标号为0的节点为根 ) ,v返回权值之和
//
//函数返回图连通否

bool prim( int n, type e[size][size], int f[size], type &v )
{
	int i, j, k;
	type total = 0;
	vector<bool> sign(size,0);
	vector<type> value(size,-1);

	value[0] = 0;
	if( f ) f[0] = -1;

	for( i=0; i<n; i++ )
	{
		k = -1;
		for( j=0; j<n; j++ )
			if( !sign[j] && value[j]>=0 && ( k<0 || value[j]<value[k] ) )
				k = j;

		if( k < 0 ) return false;

		sign[k] = true;
		total += value[k];

		for( j=0; j<n; j++)
			if( e[k][j] >=0 && !sign[j] && ( value[j]<0 || e[k][j] < value[j] ) )
			{
				value[j] = e[k][j];
				if( f ) f[j] = k;
			}
	}

	v = total;

	return true;
}

///////////////////////////////////////////////////////////////////

int main()
{
	int n, i, j, s;
	while( scanf( "%d", &n ) == 1)
	{
		for( i=0; i<n; i++ )
		for( j=0; j<n; j++ )
			scanf( "%d", &e[i][j] );

		prim( n, e, 0, s );
	
		printf( "%d\n", s );
	}

	return 0;
}

⌨️ 快捷键说明

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