P1828 [USACO3.2]香甜的黄油 Sweet Butter

2024-01-30 09:38

本文主要是介绍P1828 [USACO3.2]香甜的黄油 Sweet Butter,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

快速链接

  • 原题链接
  • 题目大意
  • 输入格式
  • 输出格式
  • 数据范围
  • 解题思路
  • 上代码


原题链接

P1828
题目类型: 普 及 + / 提 高 {\color{green}{普及+/提高}} +/
AC记录:Accepted

题目大意

n n n头牛在不同的牧场,牧场之间有路线和路线的长度。现在让你找出一个牧场 k k k,使得奶牛们到牧场 k k k的总长度最短。

输入格式

第一行包含三个整数 N , P , C N,P,C N,P,C,分别表示奶牛数、牧场数和牧场间道路数。
第二行到第 N + 1 N+1 N+1行,每行一个整数,其中第 i i i行的整数表示第 i − 1 i-1 i1头奶牛所在的牧场号。
N + 2 N+2 N+2行到第 N + C + 1 N+C+1 N+C+1行,每行包含三个整数 A , B , D A,B,D A,B,D,表示牧场号为 A A A B B B的两个牧场之间有一条长度为 D D D的双向道路相连。

输出格式

输出一行一个整数,表示奶牛必须行走的最小的距离和。
S a m p l e \mathbf{Sample} Sample I n p u t \mathbf{Input} Input

3 4 5
2
3
4
1 2 1
1 3 5
2 3 7
2 4 3
3 4 5

S a m p l e \mathbf{Sample} Sample O u t p u t \mathbf{Output} Output

8

H i n t & E x p l a i n \mathbf{Hint\&Explain} Hint&Explain
样例如图所示。
在这里插入图片描述
把奶油放到 4 4 4牧场, 4 4 4牧场的奶牛不用走, 2 2 2牧场的奶牛要走 3 3 3距离, 3 3 3牧场的奶牛要走 5 5 5距离。所以总路程为0*1+5*1+3*1=8

数据范围

对于 100 % 100\% 100%的数据, 1 ≤ N ≤ 500 , 2 ≤ P ≤ 800 , 1 ≤ A , B ≤ P , 1 ≤ C ≤ 1450 , 1 ≤ D ≤ 255 1\le N\le 500,2\le P\le 800,1\le A,B\le P,1\le C\le 1450,1\le D\le 255 1N500,2P800,1A,BP,1C1450,1D255

解题思路

第一次看到这题,第一时间就想到的是 F l o y e d Floyed Floyed算法,但是 F l o y e d Floyed Floyed算法的时间复杂度为 Θ ( n 3 ) \Theta(n^3) Θ(n3),虽然可以接受,但是最后还要用 Θ ( n ) \Theta(n) Θ(n)的时间来遍历每个牧场的奶牛个数,时间复杂度瞬间上升到 Θ ( n 4 ) \Theta(n^4) Θ(n4),绝对超时。所以这题可以用 D i j k s t r a Dijkstra Dijkstra或者 S p f a Spfa Spfa做。
这里作者用的是堆优化的 D i j k s t r a Dijkstra Dijkstra,显然,我们只需要枚举放奶油的牧场,做 n n n D i j k s t r a Dijkstra Dijkstra,再把答案统计起来,就可以得出答案。时间复杂度 Θ ( n ( n + m ) log ⁡ 2 n ) \Theta(n(n+m)\log_2n) Θ(n(n+m)log2n)
如果有不会 F l o y e d Floyed Floyed D i j k s t r a Dijkstra Dijkstra的同学,可以 C l i c k h e r e \color{red}{C}\color{orange}{l}\color{yellow}{i}\color{lightgreen}{c}\color{green}{k}\ \color{lightblue}{h}\color{blue}{e}\color{purple}{r}\color{plnk}{e} Click here


最后,祝大家早日
AC

上代码

#include<iostream>
#include<cstring>
#include<queue>using namespace std;vector<pair<int,int> >  road[810];
int                     cow[810];
int                     n,m,k;int work(int f)
{priority_queue<pair<int,int> > pq;bool vis[810];int dist[810];memset(dist,0x7f,sizeof(dist));memset(vis,false,sizeof(vis));dist[f]=0;vis[f]=true;pq.push(make_pair(0,f));while(pq.size()){pair<int,int> now=pq.top();pq.pop();int step=-now.first,id=now.second;if(dist[id]!=step)continue;for(int i=0; i<road[id].size(); i++){int temp=road[id][i].first;int val=road[id][i].second;if(dist[temp]>dist[id]+val){dist[temp]=dist[id]+val;pq.push(make_pair(-dist[temp],temp));}}}int sum=0;for(int i=1; i<=n; i++)sum+=cow[i]*dist[i];return sum;
}int main()
{cin>>k>>n>>m;for(int i=1; i<=k; i++){int x;cin>>x;cow[x]++;}for(int i=1; i<=m; i++){int x,y,z;cin>>x>>y>>z;road[x].push_back(make_pair(y,z));road[y].push_back(make_pair(x,z));}int tar=0x7fffffff;for(int i=1; i<=n; i++)tar=min(tar,work(i));cout<<tar<<endl;return 0;
}

完美切题 ∼ \sim

这篇关于P1828 [USACO3.2]香甜的黄油 Sweet Butter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659816

相关文章

P2730 [USACO3.2] 魔板 Magic Squares

[USACO3.2] 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板。这是一张有 8 8 8 个大小相同的格子的魔板: 1 2 3 4 1\quad2\quad3\quad4 1234 8 7 6 5 8\quad7\quad6\quad5 8765 题目描述 我们知道魔板的每一个方格都有一种颜色。这 8 8 8 种颜

Butter Knife 8

// 部分代码省略… @Override public View getView(int position, View view, ViewGroup parent) { ViewHolder holder; if (view != null) { holder = (ViewHolder) view.getTag(); } else {

Android Butter Knife使用详解

1. 简介2. 使用场景代码示例 2.1 Activity下使用Butter Knife2.2 资源类绑定2.3 非Activity场景——Fragment中绑定2.4 非Activity场景——Adapter中绑定2.5 其他特性2.6 监听器绑定2.7 重置绑定2.8 可选绑定2.9 对包含多个监听方法的绑定——ListView OnItemSelectedListener2.10 B

UVA 10497 - Sweet Child Makes Trouble(DP+高精度)

题目链接:10497 - Sweet Child Makes Trouble 题意:n个物品,原来物品属于一个地方,现在要把物品重新放回去,问能放几种使得每个物品都与原来位置不同 思路:递推,一开始随便搞了个二维状态,dp[i][j]表示i个物品,有j个位置不同,那么dp[n][n]就是答案,递推式为: dp[i][j] = 1 (j == 0) dp[i] [j]

P1134 [USACO3.2] 阶乘问题

题目传送门: P1134 [USACO3.2] 阶乘问题 29分代码  #include<bits/stdc++.h>using namespace std;int main(){int n;cin>>n;unsigned long long s=1;for(int i=1;i<=n;i++){s*=i;while(s>10){if(s%10==0) s/=10;else s=s%10;}

算法提高之香甜的黄油

算法提高之香甜的黄油 核心思想:spfa 遍历所有点作为起点 spfa求最短路最后求和返回 求最小 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 810,M = 3000,INF = 0x3f3f3f3f;int n,p,m;int id[N];int

Android Studio集成Sweet Alert Dialog报错(Error:Execution failed for task ':app:processDebugManifest'.)

Sweet Alert Dialog项目地址: https://github.com/pedant/sweet-alert-dialog/blob/master/README.zh.md 导入方式: Gradle dependencies { compile ‘cn.pedant.sweetalert:library:1.3’ } 方案来源:http://www.tuicool.co

3月黄油奶酪行业数据分析:安佳和妙可蓝多领军市场

近些年来,随着新消费主义盛行,老少皆宜的黄油和奶酪逐渐成为都市年轻人的烘培“新宠”。 今年3月份,黄油奶酪表现的中规中矩,处在稳定发展阶段。根据鲸参谋数据显示,3月份,在线上综合电商平台(京东天猫淘宝)上黄油奶酪共卖出了将近360万件,环比上个月上涨了45%;销售额累计约1.5亿元,环比上个月上涨32%。 *数据源于鲸参谋(来自公开渠道获取与统计,数据仅供参考) 观察黄油奶酪产品的价

# [USACO3.2] 魔板 Magic Squares

[USACO3.2] 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板。这是一张有 8 8 8 个大小相同的格子的魔板: 1 2 3 4 1\quad2\quad3\quad4 1234 8 7 6 5 8\quad7\quad6\quad5 8765 题目描述 我们知道魔板的每一个方格都有一种颜色。这 8 8 8 种颜

sweet buffer

#include<stdio.h>#define INF 1<<30 //定义无穷const int MAXP=808,MAXN=508;//最大农场数目int cows[MAXN];//牛所在牧场int numOfCow[MAXN];//牧场牛的数量int minLength[MAXP][MAXP];//两牧场之间的最小路径长度bool isInQue[MAXP];//检查是否已进队