UVA11367 加满油 解题报告

【问题描述】
 
  给出n个城市间的m条道路。给出起点A和终点B,以及汽车的邮箱容量c,计算A到B的最便宜路径。假定初始时邮箱为空的。第i个城市的油价为pi。需要回答q组询问。 
 
【输入格式】
 
  第一行为n,m,表示城市数目和道路数目,其中城市编号为1..n。接下来的n行,每行一个整数pi,第i+1行的pi表示第i个城市的油价为pi。再接下来的m+1行,每行表示一条道路a,b,d(0<=a,b

 
【输出格式】
 
  每个询问输出一个整数,表示对应询问的最便宜路径,如果无法到达,输出impossible.
 
【输入样例】
 
5 5
10
10
20
12
13
1 2 9
1 3 8
2 3 1
2 4 11
3 4 7
2
10 2 4
20 3 5 
 
【输出样例】
 
80
impossible
 
【数据范围】
 
n<=200  m<=10000  q<=100  0  
【来源】
 

《大白书》UVa 11367



需要注意的是,UVa题库中的该题的城市是从0到n-1号城市的,且n<=1000。

解题思路见代码及代码中的解释,下列代码为通过UVa原题的代码。


#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=1005;
const int inf=1000000010;
int N,M,a,b,q,c;
int p[maxn];
vectorg[maxn],w[maxn];
struct data
{
	int id,v,s;
	friend bool operator < (data aa,data bb)
	{
		return aa.v>bb.v;
	}
};
int d[maxn][105];  //f(i,j)表示到第i个城市剩余j升油时的最小花费 
void DIJ(int s)
{
	priority_queueq;
	for(int i=0;i<=N;i++)
	for(int j=0;j<=c;j++)
	d[i][j]=inf;
	q.push((data){s,0,0});
	d[s][0]=0;
	while(!q.empty())
	{
		data t=q.top();  q.pop();
		int i=t.id;
		if(i==b)   //注意在取到第一个可以到达终点城市时,因为已是最优值,则可以直接输出答案,这样可以大大优化时间
		{
			printf("%d\n",t.v);
			return;
		}
		if(d[i][t.s]t.v+p[i])  //油箱未满,且加油后费用比原费用小,则可以加油 
		{
			d[i][t.s+1]=t.v+p[i];
			q.push((data){i,d[i][t.s+1],t.s+1});
		}
		for(int k=0;k

你可能感兴趣的:(图论知识)