题目描述:

农夫John发现了做出全威斯康辛州最甜的黄油的方法:糖。

把糖放在一片牧场上,他知道 N 只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。

当然,他将付出额外的费用在奶牛上。

农夫John很狡猾,就像以前的巴甫洛夫,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场。

他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶。

农夫John知道每只奶牛都在各自喜欢的牧场(一个牧场不一定只有一头牛)。

给出各头牛在的牧场和牧场间的路线,找出使所有牛到达的路程和最短的牧场(他将把糖放在那)。

数据保证至少存在一个牧场和所有牛所在的牧场连通

输入格式

第一行: 三个数:奶牛数 N,牧场数 P,牧场间道路数 C。

第二行到第 N+1 行: 1 到 N 头奶牛所在的牧场号。

第 N+2 行到第 N+C+1 行:每行有三个数:相连的牧场A、B,两牧场间距 D,当然,连接是双向的。

输出格式

共一行,输出奶牛必须行走的最小的距离和。

数据范围

1≤N≤500,
2≤P≤800,
1≤C≤1450,
1≤D≤255

输入样例:

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

输出样例:

8

分析:

本题要求在图中找一点,使得该点到给定若干个点的距离之和最小,为此,我们需要直到任意两点间的距离,需要求多源最短路。但是Floyd算法时间复杂度是立方级别的,800^3 = 512000000,约是5亿多,会超时,所以用解决单源最短路的算法去求解本题,堆优化版的dijkstra算法是O(mlogn),对每个点都执行下dijkstra就是O(mnlogn),1450*2*800*log800约等于2000多w,可以通过。因此本题的解法就是对每个点求下最短路,然后计算下到奶牛所在地的距离和,最后取最小值即可。

唯一要注意的是并不是所有的顶点都可以到达,因此,当从某个顶点出发到达不了奶牛所在地时,距离和可能会爆int,导致最后输出的是负数,所以求距离和的时候要判断下是否存在不可达的点。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 805,M = 2905,INF = 0x3f3f3f3f;
typedef pair<int,int> PII;
int n,m,k,d[N],c[N];
int idx,h[N],e[M],ne[M],w[M];
bool st[N];
priority_queue<PII> pq;
void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int dijkstra(int s){memset(st,false,sizeof st);memset(d,0x3f,sizeof d);d[s] = 0;pq.push({-d[s],s});while(pq.size()){int u = pq.top().second;pq.pop();if(st[u])   continue;st[u] = true;for(int i = h[u];~i;i = ne[i]){int j = e[i];if(!st[j] && d[j] > d[u] + w[i]){d[j] = d[u] + w[i];pq.push({-d[j],j});}}}int ans = 0;for(int i = 0;i < k;i++){ans += d[c[i]];if(ans > INF)   return INF;}   return ans;
}
int main(){scanf("%d%d%d",&k,&n,&m);memset(h,-1,sizeof h);for(int i = 0;i < k;i++)    scanf("%d",&c[i]);int x,y,z;for(int i = 0;i < m;i++){scanf("%d%d%d",&x,&y,&z);add(x,y,z),add(y,x,z);}int ans = INF;for(int i = 1;i <= n;i++)   ans = min(ans,dijkstra(i));printf("%d\n",ans);return 0;
}

spfa算法的时间复杂度是O(m),执行n次就是O(mn),只要两百多万执行次数,效率更加高效。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 805,M = 2905,INF = 0x3f3f3f3f;
int n,m,k,d[N],c[N];
int idx,h[N],e[M],ne[M],w[M];
bool st[N];
queue<int> q;
void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int dijkstra(int s){memset(st,false,sizeof st);memset(d,0x3f,sizeof d);d[s] = 0;q.push(s);st[s] = true;while(q.size()){int u = q.front();q.pop();st[u] = false;for(int i = h[u];~i;i = ne[i]){int j = e[i];if(d[j] > d[u] + w[i]){d[j] = d[u] + w[i];if(!st[j]){q.push(j);st[j] = true;}}}}int ans = 0;for(int i = 0;i < k;i++){ans += d[c[i]];if(ans > INF)   return INF;}   return ans;
}
int main(){scanf("%d%d%d",&k,&n,&m);memset(h,-1,sizeof h);for(int i = 0;i < k;i++)    scanf("%d",&c[i]);int x,y,z;for(int i = 0;i < m;i++){scanf("%d%d%d",&x,&y,&z);add(x,y,z),add(y,x,z);}int ans = INF;for(int i = 1;i <= n;i++)   ans = min(ans,dijkstra(i));printf("%d\n",ans);return 0;
}

AcWing 1127 香甜的黄油相关推荐

  1. 算法提高课-图论-单源最短路的建图方式-AcWing 1127. 香甜的黄油:spfa最短路

    题目分析 来源:acwing 分析: 多源汇最短路.所以我们首先想到的是floyd算法, 可是它的复杂度是O(n3)O(n^3)O(n3),会超时.所以我们需要另外考虑. 任意一个点作为起点求出到所有 ...

  2. 【图论】【最短路】【SPFA】香甜的黄油 Sweet Butter (luogu 1828)

    香甜的黄油 Sweet Butter luogu 1828 题目大意: 有n头奶牛,他们在不同的牧场中,他们之间有一些路,现在要让他们去一个地方吃黄油,使他们的总距离最小 题目描述 农夫John发现做 ...

  3. 洛谷P1828 香甜的黄油 Sweet Butter

    香甜的黄油 Sweet Butter 黄油真的是这么做的吗?!!![惶恐] 这道题是Dijkstra算法的简单变形 通过题意我们要找到一个点使奶牛所在点的路程和最短.通过Dijkstra的模板我们可以 ...

  4. 信息学奥赛一本通 1345:【例4-6】香甜的黄油 | 洛谷 P1828 [USACO3.2]香甜的黄油 Sweet Butter

    [题目链接] ybt 1345:[例4-6]香甜的黄油 洛谷 P1828 [USACO3.2]香甜的黄油 Sweet Butter [题目考点] 1. 图论 最短路径 [解题思路] 将题目叙述转为图论 ...

  5. Sweet Butter 香甜的黄油

    Sweet Butter 香甜的黄油 题目大意:m个点,n头奶牛,p条边,每一头奶牛在一个点上,一个点可以有多只奶牛,求这样一个点,使得所有奶牛到这个点的距离之和最小. 注释:n<=500 , ...

  6. 香甜的黄油(SPFA)

    香甜的黄油(SPFA) Description 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好 ...

  7. 【WUSTOJ 图论之基本算法:SPFA】 1013: 香甜的黄油

    题目描述: 1013: 香甜的黄油 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄 ...

  8. 【例4-6】香甜的黄油

    [例4-6]香甜的黄油 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1345 时间限制: 1000 ms         内存限制: 65536 ...

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

    香甜的黄油 1.问题分析 2.具体代码 3.总结 题目链接 1.问题分析 模拟一遍过程,就可以发现只需要先跑一遍最短路,再搜出结果就行了. 复习最短路的水题. 2.具体代码 #include < ...

最新文章

  1. 正则表达式实现最小匹配
  2. 我认识Linux的小羞愧历史
  3. CMakeListx.txt 编辑语法学习
  4. 消息中间件和JMS介绍
  5. c++函数模板和类模板
  6. 字节月薪6万招 kubernetes 开发,看到要求我傻眼了……
  7. 大神开发的模板框架 包括常见的功能
  8. 使用RedisTemplate执行lua脚本
  9. UG NX 12 将草图对象转化为参考线
  10. Node.js安装(window10需要管理员权限)
  11. linux 无线ap模式,在Linux(CentOS)上开启小度WIFI无线AP模式
  12. Todd.log - a place to keep my thoughts on programming TF-IDF模型的概率解释
  13. 小蓝本 第一本《因式分解技巧》 第一章 提公因式 笔记(第一天)
  14. 树莓派3b+和 intel movidius 神经元计算棒2代 跑yolo v3 tiny
  15. 观察者(observer)模式(二) —— 实现线程安全的监听器
  16. 小程序——疫情下企业数字化的新方向
  17. 腾讯音乐回港上市,抖音取代网易云,成为腾讯音乐终极对手?
  18. 怎样无损放大图片?这几个方法不容错过
  19. An abnormal horizontal ListView-like pile layout.
  20. 锐起无盘xp 1.5 试装手记(转)

热门文章

  1. 中软国际java 笔试 面试题
  2. 写出10以内的奇偶数php,幼儿园中班科学活动“认识奇数偶数”
  3. 四旋翼无人机学习第23节--原理图与PCB库开源计划
  4. Python 模拟NBA文字直播 V1.0
  5. go 语言 优势及 主要用途
  6. windows 如何批量修改文件后缀名?
  7. 【Python安装配置教程】
  8. 八戒踩坑- php7.3.11 “continue“ targeting switch is equivalent to “break“
  9. 一个恋爱小故事告诉你什么是gRPC?!
  10. UBUNTU ROS 编译后无法rosrun package文件(已解决)