问题描述
  C国共有n个城市。有n-1条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达。小R来到C国旅行,他共规划了m条旅行的路线,第i条旅行路线的起点是si,终点是ti。在旅行过程中,小R每行走一单位长度的路需要吃一单位的食物。C国的食物只能在各个城市中买到,而且不同城市的食物价格可能不同。
  然而,小R不希望在旅行中为了购买较低价的粮食而绕远路,因此他总会选择最近的路走。现在,请你计算小R规划的每条旅行路线的最小花费是多少。
输入格式
  第一行包含2个整数n和m。
  第二行包含n个整数。第i个整数wi表示城市i的食物价格。
  接下来n-1行,每行包括3个整数u, v, e,表示城市u和城市v之间有一条长为e的双向道路。
  接下来m行,每行包含2个整数si和ti,分别表示一条旅行路线的起点和终点。
输出格式
  输出m行,分别代表每一条旅行方案的最小花费。
样例输入
6 4
1 7 3 2 5 6
1 2 4
1 3 5
2 4 1
3 5 2
3 6 1
2 5
4 6
6 4
5 6
样例输出
35
16
26
13
样例说明
  对于第一条路线,小R会经过2->1->3->5。其中在城市2处以7的价格购买4单位粮食,到城市1时全部吃完,并用1的价格购买7单位粮食,然后到达终点。
评测用例规模与约定
  前10%的评测用例满足:nm ≤ 20, wi ≤ 20;
  前30%的评测用例满足:nm ≤ 200;
  另有40%的评测用例满足:一个城市至多与其它两个城市相连。
  所有评测用例都满足:1 ≤ nm ≤ 105,1 ≤ wi ≤ 106,1 ≤ e ≤ 10000。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
vector<pair<int,int> > ss[100000+1];
int cost[100000+1];
int visited[100000+1];
ll c,mc,ml,l;
int t;
void dfs(int m,int n)
{
if(m==n)
{
mc=min(c,mc);
return;
}
for(int i=0;i<ss[m].size();i++)
{
int a=ss[m][i].first,b=ss[m][i].second;
if(!visited[a])
{
if(c+b*t>mc)continue;
if(l+b>ml)continue;
int fc=c,fl=l,ft=t;
visited[a]=1;c+=b*t;
l+=b;t=min(t,cost[a]);
dfs(a,n);
visited[a]=0;c=fc;l=fl;t=ft;
}
}
}
int main()
{
int n,m;cin>>n>>m;
for(int i=1;i<n+1;i++)
{
cin>>cost[i];
}
for(int i=1;i<n;i++)
{
int u,v,e;cin>>u>>v>>e;
ss[u].push_back(make_pair(v,e));
ss[v].push_back(make_pair(u,e));
}
while(m--)
{
int start,en;cin>>start>>en;
int d[n+1];memset(d,127,sizeof(d));
int vis[n+1]={0};
priority_queue<pair<int,int> > s;
while(!s.empty())s.pop();
s.push(make_pair(0,start));
while(!s.empty())
{
int v=s.top().second;s.pop();
if(v==en)break;
if(vis[v])continue;
vis[v]=1;
for(int i=0;i<ss[v].size();i++)
{
int node=ss[v][i].first,len=ss[v][i].second;
if(!vis[node])
{
if(len+d[v]<d[node])
{
d[node]=len+d[v];
s.push(make_pair(-d[node],node));
}
}
}
}
ml=d[en];c=0;
mc=ml*cost[start];
memset(visited,0,sizeof(visited));
l=0;t=cost[start];
visited[start]=1;
dfs(start,en);
cout<<mc<<endl;
}
return 0;
}

ccf 201503-5 最小花费 这题交上去只有10分嗨!求大佬的题解啊的更多相关文章

  1. 把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend

    //把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend //dp[i][j]:把第i个数转成第j小的数,最小花费 //此题与po ...

  2. 第四届CCF软件能力认证(CSP2015) 第五题(最小花费)题解

    [问题描述] C国共有$n$个城市.有$n-1$条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达.小R来到C国旅行,他共规划了$m$条旅行的路线, 第$i$条旅行路线的起点是$s_i$,终 ...

  3. [LeetCode] Minimum Cost to Merge Stones 混合石子的最小花费

    There are N piles of stones arranged in a row.  The i-th pile has stones[i] stones. A move consists ...

  4. pta7-20 畅通工程之局部最小花费问题(Kruskal算法)

    题目链接:https://pintia.cn/problem-sets/15/problems/897 题意:给出n个城镇,然后给出n×(n-1)/2条边,即每两个城镇之间的边,包含起始点,终点,修建 ...

  5. POJ 3171.Cleaning Shifts-区间覆盖最小花费-dp+线段树优化(单点更新、区间查询最值)

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4721   Accepted: 1593 D ...

  6. Codeforces Round #466 (Div. 2) B. Our Tanya is Crying Out Loud[将n变为1,有两种方式,求最小花费/贪心]

    B. Our Tanya is Crying Out Loud time limit per test 1 second memory limit per test 256 megabytes inp ...

  7. 九度OJ 1086:最小花费 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3960 解决:819 题目描述: 在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对应关系如下 ...

  8. 【uva 1515】Pool construction(图论--网络流最小割 模型题)

    题意:有一个水塘,要求把它用围栏围起来,每个费用为b.其中,(#)代表草,(.)代表洞,把一个草变成洞需要费用d, 把一个洞变成草需要费用f.请输出合法方案中的最小费用. 解法:(不好理解...... ...

  9. ZOJ3715 竞选班长求最小花费

    题意:       有n个小朋友竞选班长,一号想当班长,每个人都必须选择一个人当班长,并且不可以选择自己,并且每个人都有一个权值ai,这个权值就是如果1想让这个人改变主意选择自己当班长就得给他ai个糖 ...

随机推荐

  1. idea中Springcloud同时运行多个模块、微服务

    idea中有个窗口叫做 Run DashBoard 在这里可以管理多个模块的启停,这个面板一般情况下是关闭的打开Run DashBoard面板 在工程的.idea中找到workspace.xml,并找 ...

  2. node编写定时任务,for循环只执行一遍的解决办法

    在用node编写定时任务时候,发现for循环只执行i=0这一次,就不接着循环执行了,下面贴上代码: exports.task = async function(ctx){ let { app } = ...

  3. VUE 安装及项目创建

    Vue.js 安装cnpm npm install -g 镜像 cnpm --registry=https://registry.npm.taobao.org 安装 vue.js cnpm insta ...

  4. 解决mySQL数据库锁表问题。

    先用这条命令查询数据库阻塞的进程 SELECT * FROM information_schema.innodb_trx 找到后在根据下图这个字段:try_mysql_thread_id 作为这条数据 ...

  5. 03-MySQL表操作

    MySQL表操作 1.介绍 表就相当于文件,表中的一条记录就相当与文件的一行内容,不同的是,表中的一条记录有对应的标题,成为表的字段. 2.创建表 2.1语法 create table 表名( 字段名 ...

  6. wince可用的7-zip

    7-zip下载   7-zip    

  7. Oracle查询字符串数据进行排序,以及去重复

    原本的的一张表,填写数据的字段为字符串varchar2类型,然后进行排序的时候,就会出现问题.会默直接默认判断为第一个数字9最大,而不判断整个数字的大小. 所以,就要用到TO_NUMBER函数 sel ...

  8. ES6 Promise 用法讲解

    Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...

  9. vue.js实战——props数据验证(自定义构造器检测)

    Vue.component('my-component',{ props:{ //必须是数字类型 propA:Number, //必须是字符串或数字类型 propB:[String,Number], ...

  10. git总结二、关于分支上——好好认识下分支是怎么回事

    同样需要先来明确两件事: HEAD指针指向的是当前分支 分支(master, dev)指向的是最新的提交 一开始,git 中只有一个master分支,严格来讲,HEAD不是指向提交而是指向master ...