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 lironghua at 2008-05-11 23:38:10 on Problem 1511
一开始数组开大了,结果CE,后来改为动态分配数组还是WA,请大牛帮忙看看我的代码,到底问题出在哪里。
#include <iostream>
#include <cstdio>

using namespace std;

int n;
__int64 **g,*d,*q;
int *h,*p;
int qsize;


void Makequeue ()//初始化优先队列
{
	for (int i = 2; i <= n; i++)
	{
		q[i] = 1000000001;//对应的d值,根据d值来建优先队列(最小堆)
		h[i] = i;//其中的i表示堆的编号,h[i]的值为图的顶点编号
		p[i] = i;//其中的i为图的顶点编号,p[i]的值为对应的堆的编号
	}
	q[1] = 0;
	h[1] = 1;
	p[1] = 1;
	qsize = n;
}

inline bool isEmpty()
{
	if (qsize == 0)
		return true;
	else
		return false;
}

void down ()	//从堆的根处向下调整最小堆
{
	int i,j,min,t;
	i = 1;
	while (1)
	{
		j = 2 * i;
		if (j < qsize)
		{
			if (q[j] > q[j + 1])
				min = j + 1;
			else
				min = j;
		}
		else if (j == qsize)
			min = j;
		else
			break;
		if (q[min] < q[i])
		{
			t = q[i];//交换d值
			q[i] = q[min];
			q[min] = t;
			t = h[i];//交换对应的顶点编号
			h[i] = h[min];
			h[min] = t;
			p[h[i]] = min;//重置顶点号与该顶点在堆中的编号
			p[h[min]] = i;
			i = min;
		}
		else
			break;
	}
}

void up (int x)//x表示在图中编号为x的顶点,从p[x]处往上调整最小堆
{
	int t;
	int i;
	i = p[x];
	while (i > 1)
	{
		if (q[i] < q[i / 2])
		{
			t = q[i];//交换d值
			q[i] = q[i / 2];
			q[i / 2] = t;
			t = h[i];//交换对应的顶点编号
			h[i] = h[i / 2];
			h[i / 2] = t;
			p[h[i]] = i / 2;//重置顶点号与该顶点在堆中的编号
			p[h[i / 2]] = i;
			i = i / 2;
		}
		else
			break;
	}
}

int extractMin ()//取得堆的根元素所对应的顶点编号
{
	int t;
	t = h[1];//将堆根元素的顶点编号与堆最后一个元素的顶点编号交换
	h[1] = h[qsize];
	h[qsize] = t;
	p[h[1]] = qsize;////重置顶点号与该顶点在堆中的编号
	p[h[qsize]] = 1;
	qsize--;//堆中元素减1
	down ();
	return t;//返回堆的根元素所对应顶点编号
}

void decrease (int x, int dx)//将顶点x的值减去dx,并调整堆
{
	q[p[x]] = q[p[x]] - dx;
	up (x);
}

void Dijkstra ()//dijkstra 算法求最短路径
{
	int i,u,dx;
	for (i = 2; i <= n; i++)
		d[i] = 1000000001;
	d[1] = 0;
	Makequeue ();
	while (!isEmpty())
	{
		u = extractMin ();
		for (i = 1; i <= n; i++)
		{
			if (d[i] > d[u] + g[u][i])
			{
				dx = d[i] - d[u] - g[u][i];
				d[i] = d[u] + g[u][i];
				decrease (i,dx);
			}
		}
	}
}

int main ()
{
//	freopen ("1511.txt","r",stdin);
	int t,i,j,m,dd,s;
	__int64 sum1,temp,c;
	scanf ("%d",&t);
	while (t--)
	{
		scanf ("%d%d",&n,&m);

		g = new __int64* [n + 1];
		for (i = 0; i <= n; i++)
			g[i] = new __int64 [n + 1];
		d = new __int64 [n + 1];
		h = new int [n + 1];
		q = new __int64 [n + 1];
		p = new int [n + 1];

		for (i = 1; i <= n; i++)
			for (j = 1; j <= n; j++)
			{
				g[i][j] = 1000000001;
			}
		for (i = 1; i <= n; i++)
		{
			g[i][i] = 0;
		}
		for (i = 0; i < m; i++)
		{
			scanf ("%d%d%I64d",&s,&dd,&c);
			g[s][dd] = c;
		}
		Dijkstra ();
		sum1 = 0;
		for (i = 2; i <= n; i++)
			sum1 = sum1 + d[i];
		
		for (i = 1; i <= n; i++)
			for (j = i; j <= n; j++)//将边反向
			{
				temp = g[i][j];
				g[i][j] = g[j][i];
				g[j][i] = temp;
			}
		Dijkstra ();
		for (i = 2; i <= n; i++)
			sum1 = sum1 + d[i];
		printf ("%I64d\n",sum1);
		free (d);
		free (h);
		free (p);
		free (q);
		for (i = 0; i <= n; i++)
			free (g[i]);
		free (g);
	}
	return 0;
}
AC了的大牛能否发一份带优先队列优化的Dijkstra算法的代码至
lironghuascut@yahoo.com.cn中,感激不尽。

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