[USACO10FEB]Chocolate Giving S

题意描述

Farmer John有B头奶牛(1<=B<=25000),有N(2*B<=N<=50000)个农场,编号1-N,有M(N-1<=M<=100000)条双向边,第i条边连接农场R_i和S_i(1<=R_i<=N;1<=S_i<=N),该边的长度是L_i(1<=L_i<=2000)。居住在农场P_i的奶牛A(1<=P_i<=N),它想送一份新年礼物给居住在农场Q_i(1<=Q_i<=N)的奶牛B,但是奶牛A必须先到FJ(居住在编号1的农场)那里取礼物,然后再送给奶牛B。你的任务是:奶牛A至少需要走多远的路程?

输入

6 7 3

1 2 3

5 4 3

3 1 1

6 1 9

3 4 2

1 4 4

3 2 2

2 4

5 1

3 6

输出

6

6

10

点拨

转化一下就是对原点求两个点的最短路

代码

#include<iostream>
#include<utility>
#include<queue>
using namespace std;
typedef long long ll;
#define fi(i,a,b) for(int i = a; i <= b; ++i)
#define fr(i,a,b) for(int i = a; i >= b; --i)
#define x first
#define y second
#define sz(x) ((int)(x).size())
#define pb push_back
using pii = pair<int,int>;
#define int long long
//#define DEBUG
const int N = 1e5 + 5;
int cnt = 1;
int head[50005];
int dis[50005];
bool vis[50005];
struct edge{
int e,w,ne;
}edge[N];
struct node{
int e,w;
bool operator < (const node p) const{
return w > p.w;
}
}; void add(int a,int b,int c){
edge[cnt].e = b;
edge[cnt].w = c;
edge[cnt].ne = head[a];
head[a] = cnt++;
}
int n,m,b;
void djstra(int s){
priority_queue<node> pri;
pri.push({s,0});
while(!pri.empty()){
node temp = pri.top();
pri.pop();
int e = temp.e;
int w = temp.w;
vis[e] = true;
for(int j = head[e];j!=0;j=edge[j].ne){
int p = edge[j].e;
int q = edge[j].w;
if(dis[p] >= dis[e] + q){
dis[p] = dis[e] + q;
if(!vis[p]) pri.push({p,dis[p]});
}
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
#ifdef DEBUG
//freopen(D:\in.txt,r,stdin);
#endif
cin >> n >> m >> b;
fi(i,1,n) dis[i] = 0x3f3f3f3f;
dis[1] = 0;
fi(i,1,m) {
int a,b,c;
cin >> a >> b >> c;
add(a,b,c);
add(b,a,c);
}
djstra(1);
fi(i,1,b){
int a,b;
cin >> a >> b;
cout << dis[a] + dis[b] << endl;
}
return 0;
}

P2984的更多相关文章

  1. 【luogu P2984 [USACO10FEB]给巧克力Chocolate Giving】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2984 练习SPFA,把FJ当做起点,求出到所有牛的最短路,再把两个牛的相加. #include <cs ...

  2. 洛谷 P2984 [USACO10FEB]给巧克力Chocolate Giving

    题目描述 Farmer John is distributing chocolates at the barn for Valentine's day, and B (1 <= B <= ...

  3. 洛谷——P2984 [USACO10FEB]给巧克力Chocolate Giving

    https://www.luogu.org/problem/show?pid=2984 题目描述 Farmer John is distributing chocolates at the barn ...

  4. USACO Chocolate Giving

    洛谷 P2984 [USACO10FEB]给巧克力Chocolate Giving 洛谷传送门 JDOJ 2680: USACO 2010 Feb Silver 2.Chocolate Giving ...

随机推荐

  1. C语言:将文件中所得到的单词表保存到一个顺序表中--使用动态分配数组。

    在很多时候我们想要在程序中存储想要的信息,但是又不知道该信息的大小或者说不知道需要多长的数组来存放.动态分配空间这个很好的解决了这个问题,动态分配不仅只可以用在链表中分配节点空间,其实更多时候用来分配 ...

  2. systemctl管理自定义服务模版

    一  日常工作中,有许多需要使用systemctl进行管理服务的时候 [Unit] Description=radius Release [Service] ExecStart=/etc/init.d ...

  3. git cherry-pick合并其它分支的某次提交(commits)到当前分支

    git cherry-pick 可以选择某一个分支中的一个或几个commit(s)来进行操作. 例如,假设我们有个稳定版本的分支,叫v2.0.0,另外还有个开发版本的分支v3.0.0,我们不能直接把两 ...

  4. MYSQL 移机重装步骤(windows11)

      MYSQL 移机重装步骤(windows11)   目的:已有电脑 A,D盘安装有mysql(安装方式为免安装) , 准备在另一台电脑B上,复制安装电脑A上的mysql(8.0.23版本) . 要 ...

  5. containerd 源码分析:创建 container(一)

    0. 前言 Kubernetes:kubelet 源码分析之 pod 创建流程 介绍了 kubelet 创建 pod 的流程,containerd 源码分析:kubelet 和 containerd ...

  6. c语言不可不说的一件事——进制之间的转化

    进制之间的转换 二进制转换 二进制转换为十进制 10111010.101 转换方法: 个位数是乘以2的0次方 从小数点开始分割,(小数点前从右往左,小数点后从左往右)乘以2的对应次方(从0开始取),最 ...

  7. c# 拖拽列表顺序 | 拖拽合并分组 | 移除分组功能

    动图演示: 背景: 一开始做功能的时候没有增加排序的索引(sort-index),后来要求做拖拽排序功能:所以写了这个不需要初始排序就可以完成的拖拽功能:如果是table表格排序逻辑和这个相似,这里拿 ...

  8. 剑指Offer-59.按之字形顺序打印二叉树(C++/Java)

    题目: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 分析: 实际上是二叉树的层次遍历,只不过每一行 ...

  9. kettle从入门到精通 第五十课 ETL之kettle 课程源文件分享

    Kettle 是一款功能强大的开源 ETL 工具,被广泛应用于数据集成.数据转换和数据加载等领域.随着数据量和多样性的不断增加,使用 Kettle 进行数据处理已成为许多企业和数据工程师的首选.在过去 ...

  10. golang sync.Once 保证某个动作仅执行一次的机制

    type Once struct { done atomic.Uint32 m Mutex } 这段代码是 Go 语言标准库中 sync 包的一部分,定义了一个 Once 类型.Once 类型用于确保 ...