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

WA到死了,自己编了几个边缘数据也可以过。自己写了最大堆!

Posted by yogafrank at 2008-08-25 10:58:51 on Problem 1797
#include <iostream>
using namespace std;

const int SIZE = 1001;
const int INFINITE = 10000000;
int graph[SIZE][SIZE], n, m, vertex[SIZE];
bool visited[SIZE];

class HeapNode
{
public:
	int key;
	int num;
	HeapNode ()
	{
	}
	HeapNode ( int m, int n )
	{
		key = m;
		num = n;
	}
};

class MyHeap
{
private:
	HeapNode nodes[SIZE];
	int size;
private:
	void swap ( int i, int j )
	{
		HeapNode t = nodes[i];
		nodes[i] = nodes[j];
		nodes[j] = t;
	}

	int parent ( int node )
	{
		return node / 2;
	}

	int left ( int node )
	{
		return node * 2;
	}

	int right ( int node )
	{
		return node * 2 + 1; 
	}
public:
	void heapfy ( int );
	bool push ( HeapNode );
	HeapNode* pop ();

	bool isempty ()
	{
		return size < 1;
	}

	void setsize ( int size )
	{
		this->size = size;
	}
};

bool MyHeap::push ( HeapNode value )
{
	if ( size == SIZE - 1 )
		return false;

	nodes[++size] = value;
	int i = size;

	while ( i > 1 && nodes[parent( i )].key < nodes[i].key )
	{
		swap ( i, parent ( i ) );
		i = parent ( i );
	}

	return true;
}

HeapNode* MyHeap::pop ()
{
	if ( size < 1 )
		return NULL;
	HeapNode *min = new HeapNode ( nodes[1].key, nodes[1].num );

	nodes[1] = nodes[size];
	size--;
	heapfy ( 1 );

	return min;
}

void MyHeap::heapfy ( int p )
{
	int l = left ( p ), r = right ( p ), greater;

	if ( l <= size && nodes[l].key > nodes[p].key )
		greater = l;
	else
		greater = p;

	if ( r <= size && nodes[r].key > nodes[greater].key )
		greater = r;
	
	if ( greater != p )
	{
		swap ( greater, p );
		heapfy ( greater );
	}
}

int min ( int a, int b )
{
	return a > b ? b : a; 
}

MyHeap heap;

int main ()
{
	int s, i, j, k;
	for ( k = 1, scanf ( "%d", &s ); k <= s; k++ )
	{
		printf ( "Scenario #%d:\n", k );
		scanf ( "%d%d", &n, &m );

		for ( i = 1; i <= n; i++ )
		{
			vertex[i] = -1;
			for ( j = 1; j <= n; j++ )
				graph[i][j] = INFINITE;
		}

		for ( j = 0; j < m; j++ )
		{
			int from, to, weight;
			scanf ( "%d%d%d", &from, &to, &weight );
			graph[from][to] = graph[to][from] = weight;
		}

		if ( n == 1 )
		{
			printf ( "0\n\n" );
			continue;
		}

		memset ( visited, false, sizeof ( visited ) );
		heap.setsize ( 0 );
		HeapNode *node = new HeapNode ( INFINITE, 1 );
        heap.push ( *node );
		delete node;

        j = 0;
		while ( j < n && !heap.isempty () )
		{
			HeapNode *node = heap.pop ();
            j++;
			visited[node->num] = true;

			for ( i = 1; i <= n; i++ )
				if ( graph[node->num][i] < INFINITE && !visited[i] )
				{
					int value = min ( graph[node->num][i], node->key );

					if ( vertex[i] < value )
					{
						vertex[i] = value;

						HeapNode *topush = new HeapNode ( vertex[i], i );
				
						heap.push ( *topush );
						delete topush;
					}
				}
			delete node;
		}

		j = vertex[2];
		for ( i = 3; i <= n; i++ )
			if ( j > vertex[i] )
				j = vertex[i];
		printf ( "%d\n\n", j );
	}

	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