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

我是用Dijkstra最短路径做的,测了很多数据都没问题,大家能否帮我看看?

Posted by zhujie at 2006-03-05 19:02:50 on Problem 1062
#include <iostream>
#define MAXN 100
using namespace std;
int m,n;
struct OBJECT {
	int p,l,x;
}Obj[MAXN+1];
struct LIMIT {
	int up,down;
}Lim[MAXN+1];
int Dist[MAXN+1],Cost[MAXN+1][MAXN+1],Pre[MAXN+1];
bool S[MAXN+1];
bool Trade(int a,int b);
int main()
{
	cin>>m>>n;
	int i,j,a,b;
	for (i=1; i<=n; i++)  for (j=1; j<=n; j++)  Cost[i][j] = INT_MAX;
	for (i=1; i<=n; i++)
	{
		cin>>Obj[i].p>>Obj[i].l>>Obj[i].x;
		for (j=0; j<Obj[i].x; j++)
		{
			cin>>a>>b;
			Cost[i][a] = Cost[a][i] = b;
		}
	}
	//for (i=1; i<=n; i++)  {for (j=1; j<=n; j++) cout<<Cost[i][j]<<' ';cout<<endl;}
	memset(S,0,sizeof(S));
	for (i=1; i<=n; i++) { Dist[i] = INT_MAX; Lim[i].up = Obj[i].l + m; Lim[i].down = Obj[i].l - m;}
	Dist[1] = 0;  S[1] = true;
	for (i=1; i<=n; i++)  Pre[i] = -1;
	int v,d;
	for (i=2; i<=n; i++) 
		if (Trade(1,i)) { Dist[i] = Cost[1][i]; Pre[i] = 1;}
	//for (i=1; i<=n; i++) cout<<Dist[i]<<' ';cout<<endl;
	for (i=2; i<=n; i++)
	{
		v = 1;
		d = INT_MAX;
		for (j=1; j<=n; j++)
			if (!S[j] && Dist[j] < d)
			{
				v = j;  d = Dist[j];
			}
		if (v == 1)  break;//cout<<v<<endl;
		S[v] = true;
		Lim[v].up = Lim[Pre[v]].up < Lim[v].up ? Lim[Pre[v]].up : Lim[v].up;
		Lim[v].down = Lim[Pre[v]].down > Lim[v].down ? Lim[Pre[v]].down : Lim[v].down;
		//cout<<Lim[v].up<<' '<<Lim[v].down<<' '<<endl;
		//cout<<d<<endl;
		for (j=1; j<=n; j++)
		{
			if (!S[j] && Cost[v][j] != INT_MAX && (d + Cost[v][j] < Dist[j]) && Trade(v,j))
			{
				Dist[j] = d + Cost[v][j];
				
				Pre[j] = v;
			}
		} 
	}

	for (i=1; i<=n; i++) if (Dist[i] != INT_MAX) Dist[i] += Obj[i].p;
	//for (i=1; i<=n; i++) cout<<Dist[i]<<' ';cout<<endl;
	int min = INT_MAX;
	for (i=1; i<=n; i++)
		if (Dist[i] < min)  min = Dist[i];
	cout<<min<<endl;
	return 0;
}
bool Trade(int a,int b)
{
	return (Obj[b].l <= Lim[a].up && Obj[b].l >= Lim[a].down) ;
}

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