Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

我用的Prim求最小生成树,WA,是题目理解错了呢,还是程序有bug?"

Posted by alpc06 at 2005-12-11 08:35:58 on Problem 2349
/*
 *Descripttion: 2349 Arctic Network
 *				It seems that this problem is a MST problem
 *More :	Prim algorithm
 *Author : BlueBlood --	RTFSC
 *Time: 2005 - 12- 09
 */

#include <iostream>
#include <cstdlib>
#include <cstdlib>
#include <algorithm>
#include <cmath>

using namespace std;

#define MAXWEIGHT 32767

typedef struct{
	int vi;		//head of a edge
	int vj;		//tail of a edge
	double weight;	
} edge;

int s;
int p;
double d;
int * x;
int * y;
double ** adj;
double *res;
edge *T;

void Prim( void )
{
	int m;
	int v;
	int nmin;
	double dis;

	edge e;

	//Initializing T;
	for (int j = 1; j < p; j++)
	{
		T[j-1].vi = 1;
		T[j-1].vj = j + 1;
		T[j-1].weight = adj[0][j];
	}

	//find out the k+1 th MST's edge
	for (int k = 0; k < p - 1; k++)
	{
		nmin = MAXWEIGHT;

		//find the edge with the smallest weight from T[k],..., T[n-2] to join the MST;
		for (j = k; j < p - 1; j++)
		{
			if (T[j].weight < nmin)
			{
				nmin = T[j].weight;
				m = j;
			}
		}
		

		//Exchange T[m] & T[k];
		e = T[m]; 
		T[m] = T[k];
		T[k] = e;

		//v is the number of the vertex newly added to MST
		v = T[k].vj;

		//Modify T[k + 1], T[k + 2],..., T[n - 1];
		for (j = k + 1; j < p - 1; j++)
		{
			dis = adj[v-1][T[j].vj - 1];

			if ( d < T[j].weight)
			{
				T[j].weight = dis;
				T[j].vi  = v;
			}
		}

	}
}

int main()
{
	int testCase;
	int i;
	int j;
	int k;
	
	cin >> testCase;

	for ( i = 0;  i < testCase; i++)
	{
		cin >> s >> p;

		x = new int [p];
		y = new int [p];
		adj = new double * [p];
		res = new double [p];
		T = new edge [p];

		for (j = 0; j < p; j++)
		{
			cin >> x[j] >> y[j];
			adj[j] = new double [p];
		}

		for (j = 0; j < p; j++)
			for (k = 0; k < p; k++)
			{
				if (k == j)
					adj[j][k] = MAXWEIGHT;
				else
					adj[j][k] = sqrt( (x[j] - x[k])*(x[j] - x[k]) + (y[j] - y[k])*(y[j] - y[k]));
			}


		Prim();

		for ( i = 0; i < p - 1 ; i++)
		{
			res[i] = T[i].weight;
		}

		sort(&res[0], & res[p-1]);

		printf("%.2f\n",res[p-1-s]);

	}

	system("pause");
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator