题目描述:

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. 零基础java培训如何规划学习路线
  2. 没有数学何来计算机:论计算机起源的数学思想
  3. webstorm更改scss输出路径
  4. 大厂笔试 java基础
  5. 云原生系列「三」容器网络
  6. boost::ratio_greater相关的测试程序
  7. Socket阻塞与非阻塞,同步与异步、I/O模型
  8. 前端学习(1805):前端调试之列表伪类练习
  9. OpenVSLAM:日本先进工业科技研究所新开源视觉SLAM框架
  10. pyspark 编写 UDF函数
  11. hive mysql互导_利用Sqoop实现Hive的数据与MySQL数据的互导
  12. jQuery Mobile主题使用与定制
  13. 链接地址中的target=”_blank”属性安全性处理
  14. python调用Java代码并执行--------jpype使用篇
  15. jquery 删除元素remove,empty
  16. Kafka实战之整合Flume和Kafka完成实时数据采集
  17. sqlhelper java_java 版本SQLHelper
  18. 你居然只知道蓝绿发布?今天教你全链路灰度~
  19. WebRTC回声消除(1)
  20. 2019-01-01T00:00:00.000Z 这种时间日期类型格式是属于:格林尼治时间

热门文章

  1. Windows定时执行python任务可能出错的情况
  2. 任务调度之Quartz
  3. golang 正向代理服务器(支持tcp)
  4. Web中常用字体介绍(ios和android浏览器支持的字体),Mark以后留用
  5. 和我一起学习Processing全系列--01 Processing 介绍
  6. 单女最容易邂逅好男人的10个地方
  7. JAVA-调用第三方接口获取数据的例子
  8. JMU软件20 形式化建模与分析复习
  9. 数组排序(python)
  10. 计算机知识音频转换,教你如何从原版音频中轻松提取音乐