试题编号: | 201503-5 |
试题名称: | 最小花费 |
时间限制: | 4.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 C国共有n个城市。有n-1条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达。小R来到C国旅行,他共规划了m条旅行的路线,第i条旅行路线的起点是si,终点是ti。在旅行过程中,小R每行走一单位长度的路需要吃一单位的食物。C国的食物只能在各个城市中买到,而且不同城市的食物价格可能不同。 输入格式 第一行包含2个整数n和m。 输出格式 输出m行,分别代表每一条旅行方案的最小花费。 样例输入 6 4 样例输出 35 样例说明 对于第一条路线,小R会经过2->1->3->5。其中在城市2处以7的价格购买4单位粮食,到城市1时全部吃完,并用1的价格购买7单位粮食,然后到达终点。 评测用例规模与约定 前10%的评测用例满足:n, m ≤ 20, wi ≤ 20; |
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <time.h>
#include <vector>
#include <list>
using namespace std;
//201503-5 最小花费
struct City {
int key, lenth;
City(int _key, int _lenth) {
key = _key;
lenth = _lenth;
}
};
//定义一个向量数组
vector<City>Data[100001];
long long Min_Cost;
bool End_Flag;
//Min_Pri 必须为long long,否则10分
void DFS(bool Flag[], long long Price[], long long cost, long long Min_Pri, int now, int to)
{
Flag[now] = 1;
if (now == to)
{
Min_Cost = cost;
End_Flag = 1;
return;
}
else if (!End_Flag)
{
for (int i = 0; i < Data[now].size(); i++)
{
if (!Flag[Data[now][i].key])
{
int Min;
if (Price[Data[now][i].key] < Min_Pri)
Min = Price[Data[now][i].key];
else
Min = Min_Pri;
long long Cost = cost + Min_Pri * Data[now][i].lenth;
//cout << "::" << Data[now][i].key <<"::"<<Cost<< endl;
DFS(Flag, Price, Cost, Min, Data[now][i].key, to);
}
}
}
}
int main()
{
int i, j, N, M;
int x, y, len;
cin >> N >> M;
long long Price[100001];
for (i = 1; i <= N; i++)
{
cin >> Price[i];
}
for (i = 1; i < N; i++)
{
cin >> x >> y >> len;
City C(y, len);
Data[x].push_back(C);
C.key = x;
Data[y].push_back(C);
}
int From, To;
for (i = 0; i < M; i++)
{
cin >> From >> To;
bool Flag[100001] = { 0 };
End_Flag = 0;
DFS(Flag, Price, 0, Price[From], From, To);
cout << Min_Cost << endl;
}
cin >> N;
return 0;
}