题目描述:

1013: 香甜的黄油

农夫John发现做出全威斯康辛州最甜的黄油的方法:糖。把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。当然,他将付出额外的费用在奶牛上。
农夫John很狡猾。像以前的巴甫洛夫,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场。他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶。
农夫John知道每只奶牛都在各自喜欢的牧场(一个牧场不一定只有一头牛)。给出各头牛在的牧场和牧场间的路线,找出使所有牛到达的路程和最短的牧场(他将把糖放在那)。

Input
多组测试数据。
第一行: 三个数:奶牛数N,牧场数P(2<=P<=800),牧场间道路数C(1<=C<=1450)。
第二行到第N+1行: 1到N头奶牛所在的牧场号。
第N+2行到第N+C+1行:每行有三个数:相连的牧场A、B,两牧场间距(1<=D<=255),当然,连接是双向的。

Output
输出一行,一个整数,即奶牛必须行走的最小的距离和.

Sample Input

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

Sample Output
8


思路:

本题可以用图论之算法SPFA来做。其实这个算法跟那个什么dij算法很像(具体区别我觉得就是做了一些优化吧)
SPFA算法其实就是:终点不变,只是各种起点不同的各种情况,从终点出发,先算出到各点的最小距离,然后讨论中介点,算出终点到中介点的最小距离,然后加上这个中介点到起点的距离,最终得出的其实就是终点到各点的最小距离(这里就不做证明了因为我也不会,太菜了qaq,有兴趣可以去百度)。
本体其实就是算出终点到各个起点距离最小值,然后相加就是最终结果(多头奶牛,多个起点,贪心)。欧克上AC代码:

    #include<cstdio>#include<cstring>#include<queue>#include<algorithm>#define inf 2e8using namespace std;int n,p,c;int a[801][801]={0},cow[801],dis[801],b[801][801]={0};//a为邻接矩阵,cow记录牛的牧场编号//所在牧场编号,b记录x或者y连同的各条路bool flag[801]={false};void spfa(int x)//讨论的放黄油的第i个牧场的情况{memset(flag,0,sizeof(flag));for(int i=1;i<=p;i++)dis[i]=inf;queue<int>q;q.push(x);dis[x]=0;//终点x作为起点,开始搜索到各个起点的最小路程while(!q.empty()){int k=q.front();//之前可能有一阶情况入队,看之后是直接到,还是二阶最好,最开始是x,0阶,先算出终点到各个点的最优情况for(int i=1;i<=b[k][0];i++){int t=b[k][i];//枚举k通往的各个牧场,k可以通往的各个牧场,提取出来,赋值给tif(a[k][t]!=inf&&dis[t]>dis[k]+a[k][t]){//如果k到t有路并且是所有路径中到t路程最小的,赋值dis[t]=dis[k]+a[k][t];//disk是到k的最小情况if(!flag[t]){//如果还没有讨论过起点为t的情况,则接下来入队t,之后搜索t,这是对于同一个k通往的情况而言的,前面可能t已经入队,此时只需要赋值最小即可q.push(t);flag[t]=true;}}}flag[k]=false;q.pop();//本次的k讨论过了,有可能会刷新,之后还要搜索这个点(遇到了更优的情况)}}int main(){while(~scanf("%d%d%d",&n,&p,&c))//其实这个算法时间复杂度不低,保险起见这里使用快速读入{int x,y,z,i,j,k,count,minx;memset(b,0,sizeof b);for(i=1;i<=n;i++)for(k=1;j<=n;j++)a[i][k]=inf;//初始化最大值,不能直接用memset!for(i=1;i<=n;i++)scanf("%d",&cow[i]);for(i=1;i<=c;i++){scanf("%d%d%d",&x,&y,&z);a[x][y]=a[y][x]=z;b[x][0]++;b[y][0]++;//0用于存放x,y联通路径数目b[x][b[x][0]]=y;b[y][b[y][0]]=x;}minx=inf;for(i=1;i<=p;i++){spfa(i);count=0;//分别以各个点为黄油地点进行讨论,每个点都通过spfa算法得出最小值for(j=1;j<=n;j++) if(dis[cow[j]]<inf)count+=dis[cow[j]];//找出到各起点的最短路径后加起来minx=min(count,minx);}printf("%d\n",minx);}return 0;}

批注中也写得尽量详细了,测试时间463ms,看来运气也挺不错了~对于wustoj是刚好能过了
有问题欢迎留言评论!

【WUSTOJ 图论之基本算法:SPFA】 1013: 香甜的黄油相关推荐

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

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

  2. 03 最短路 dijkstra算法spfa算法floyd算法(附带实例代码) 图论-1

    文章目录 最短路 邻接表的图如下 邻接矩阵如下图 链表实现邻接表实现代码 单源最短路径 Dijkstra 算法 朴素版本 Dijkstra 实现代码 堆优化的dijkstra算法代码实现 Bellma ...

  3. 香甜的黄油(SPFA)

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

  4. 【阿良的算法之路】图论最短路算法模板

    图论: [阿良的算法之路]图论最短路算法模板 [模板]dirjkstra单源最短路径 [模板]Bellman-Ford多源最短路 [模板]Spfa求最短路 [模板]Spfa判断负环 [模板]Floya ...

  5. 图论模型Floyd算法

    图论模型Floyd算法 一.简介 二.MATLAB执行代码 一.简介 二.MATLAB执行代码 tulun2.m a= [ 0,50,inf,40,25,10;50,0,15,20,inf,25;in ...

  6. 图论——networkx——最短路径算法篇

    NetworkX系列教程(10)-算法之一:最短路径问题 小书匠Graph图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的 ...

  7. 最短路径算法——SPFA算法

    在家的这几天效率还是蛮低的,总是有其他的事情耽搁,然后最近就在做搜索题,然后做了两个搜索关于最短路径的,点数少的时候之前学的佛洛依德还能派上点用处,可以点数过1000之后就容易超时了,然后看他们的题解 ...

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

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

  9. Sweet Butter 香甜的黄油

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

最新文章

  1. 组态王字符串转换整数_字符串转换整数(LC8)
  2. Database Connection String
  3. Android 第三方之MPAndroidChart
  4. Acwing104. 货仓选址:贪心(绝对值不等式)
  5. 子弹短信新发布,支付宝即将入驻
  6. 利用Pytorch的C++前端(libtorch)读取预训练权重并进行预测
  7. 128.最长连续序列
  8. python编程100个小程序-整理了适合新手的20个Python练手小程序
  9. easyBCD多系统引导软件
  10. 成都Uber优步司机奖励政策(3月1日)
  11. 【如何制作电子书】云展网教程 | 编辑纯文本阅读页面功能(有利于SEO收录)
  12. mysql怎么导出insert语句_mysql导出insert语句
  13. angularjs 滑块验证码 移动端_仿支付宝滑块验证码效果的手机端实现
  14. 2020第三届中青杯问题总结
  15. 关于wps删除不了多余的空白页
  16. element-ui MessageBox 弹框判断确认和取消
  17. token什么意思中文在C语言中,token是什么意思(token的含义及使用方法)
  18. Lock锁及获取锁的四种方法
  19. 【机器学习-学习笔记】吴恩达老师机器学习课的笔记(黄海广博士)
  20. Android 第三方桌面,怎么请求Widget的android.permission.BIND_APPWIDGET

热门文章

  1. python给变量赋值中文_Python变量与赋值的图文详解
  2. python修改word_有没有办法用pythondocx改变word文档的字体?
  3. RDMA 架构与实践(技术详解(一):RDMA概述)
  4. shou shen ji hua
  5. [问题已处理]-k8s报错共享内存不足
  6. Python-pip配置国内镜像源
  7. 【Mysql】mysql命令常用语句
  8. php bcmul高精度计算
  9. r33200g核显相当于什么显卡
  10. CentOS6.x环境通过yum命令在线安装或重装zookeeper-server