原来一直没去学spfa,感觉只一个Dij已经很够用了,昨天翻了一下最短路,如果路径中存在负权的话,Dij也只能素手无策,这时spfa就大显身手了。。

实现过程:

我们用数组d记录每个结点的最短路径估计值,而且用邻接表来存储图G。我们采取的方法是松弛:

设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,

并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,

且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。

这道题很明显的最短路,分别用两个版本写了下。

spfa:

View Code

 1 # include<stdio.h> 2 # include<string.h> 3 # include<queue> 4 using namespace std; 5 # define N 1005 6 # define M 2005 7 # define PI 0xfffffff 8 struct node{ 9     int from,to,next,val;10 }edge[M*2];11 int head[N],tol,visit[N],dis[N],n,m;12 void add(int a,int b,int c)13 {14     edge[tol].from=a;edge[tol].to=b;edge[tol].val=c;edge[tol].next=head[a];head[a]=tol++;15 }16 void spfa()17 {18     int u,cur,i;19     queue<int >q;20     q.push(1);21     dis[1]=0;22     visit[1]=1;23     while(!q.empty())24     {25         cur=q.front();26         visit[cur]=0;27         q.pop();28         for(i=head[cur];i!=-1;i=edge[i].next)29         {30             u=edge[i].to;31             if(edge[i].val+dis[cur]<dis[u]) 32             {33                 dis[u]=edge[i].val+dis[cur];34                 if(visit[u]==0) {visit[u]=1;q.push(u);}35             }36         }37     }38     return;39 }40 int main()41 {42     int i,a,b,c;43     scanf("%d%d",&m,&n);44     memset(head,-1,sizeof(head));45     tol=0;46     for(i=1;i<=m;i++)47     {48         scanf("%d%d%d",&a,&b,&c);49         add(a,b,c);50         add(b,a,c);51     }52     memset(visit,0,sizeof(visit));53     for(i=1;i<=n;i++)54         dis[i]=PI;55     spfa();56     printf("%d\n",dis[n]);57     return 0;58 }

Dij:

View Code

 1 # include<stdio.h> 2 # include<string.h> 3 # define N 1005 4 # define M 2005 5 # define PI 0xfffffff 6 int adj[N][N],low[N],visit[N]; 7 int main() 8 { 9     int i,n,m,min,index,index1,a,b,c;10     scanf("%d%d",&m,&n);11     memset(adj,-1,sizeof(adj));12     memset(visit,0,sizeof(visit));13     for(i=1;i<=m;i++)14     {15         scanf("%d%d%d",&a,&b,&c);16         if(adj[a][b]==-1 ||adj[a][b]>c)17         adj[a][b]=adj[b][a]=c;18     }19     for(i=1;i<=n;i++)20         low[i]=PI;21     index=1;22     low[1]=0;23     while(1)24     {25         visit[index]=1;26         min=PI;27         for(i=1;i<=n;i++)28         {29             if(visit[i]==1) continue;30             if(low[i]==PI && adj[i][index]==-1) continue;31             if(adj[i][index]!=-1)32             {33                 if(adj[i][index]+low[index]<low[i]) low[i]=adj[i][index]+low[index];34             }35             if(low[i]<min) {min=low[i];index1=i;}36         }37         index=index1;38         if(index==n) break;39     }40     printf("%d\n",low[n]);41     return 0;42 }

转载于:https://www.cnblogs.com/183zyz/archive/2011/07/22/2113478.html

pku 2387 Til the Cows Come Home相关推荐

  1. POJ 2387 Til the Cows Come Home (最短路径 模版题 三种解法)

    原题链接:Til the Cows Come Home 题目大意:有  个点,给出从  点到  点的距离并且  和  是互相可以抵达的,问从  到  的最短距离. 题目分析:这是一道典型的最短路径模版 ...

  2. Poj 2387 Til the Cows Come Home 迪杰斯特拉(普通+优化)

    Til the Cows Come Home 迪杰斯特拉(普通+优化) 贝西在田里,想在农夫约翰叫醒她早上挤奶之前回到谷仓尽可能多地睡一觉.贝西需要她的美梦,所以她想尽快回来. 农场主约翰的田里有n( ...

  3. POJ 2387 Til the Cows Come Home

    传送门:http://poj.org/problem?id=2387 这是最短路径问题,本题有重边,但是spfa能解决这个问题: 实现代码: SPFA: 1 #include <iostream ...

  4. 【POJ】2387 Til the Cows Come Home

    题目链接:http://poj.org/problem?id=2387 题意:求从1到n的最短路 题解:板子题.spfa. 代码: 1 #include<iostream> 2 #incl ...

  5. POJ - 2387 Til the Cows Come Home

    感觉一直写的dij堆优化都是假的,最短路板子spfa+ dij堆优化 SPFA #include<stdio.h> #include<string.h> #include< ...

  6. poj 2387 Til the Cows Come Home dijkstra

    题意: 贝西在田里,想在农夫约翰叫醒她早上挤奶之前回到谷仓尽可能多地睡一觉.贝西需要她的美梦,所以她想尽快回来. 农场主约翰的田里有n(2<=n<=1000)个地标,唯一编号为1-n.地标 ...

  7. A - Til the Cows Come Home POJ - 2387

    A - Til the Cows Come Home POJ - 2387 最短路 #include<iostream> #include<cstdio> #include&l ...

  8. Til the Cows Come Home(dijkstra)

    题目连接: Til the Cows Come Home 题目: Bessie is out in the field and wants to get back to the barn to get ...

  9. Til the Cows Come Home(简单的最短路)

    Til the Cows Come Home Bessie 在外地,想要在 Farmer John 叫醒她早上挤奶之前回到谷仓尽可能多地睡觉.Bessie 需要她的美容觉,所以她想尽快回来. Farm ...

最新文章

  1. 按属性对自定义对象的ArrayList进行排序
  2. 六、MySql索引分类
  3. laravel auth login 重定向自定义_Laravel学习之路(一):最简单的API 认证(Passport)实践...
  4. C#常用控件的属性以及方法(转载)
  5. fpga如何约束走线_如何正确的约束时钟—Vivado优化到关键路径
  6. vue图片点击超链接_10秒钟,告别ppt中难看的超链接
  7. python二级考试真题_全国BIM技能等级考试真题全套(一/二级,全专业,28套)
  8. lambda qt 参数 槽函数_C++中的lambda表达式用法
  9. usb耳机android,USB 耳机:配件规范  |  Android 开源项目  |  Android Open Source Project...
  10. mysql增加列并增加comment_运城多条高铁线路调整动车列数增加到99列
  11. j2ee 简单网站搭建:(十一)ckeditor 控件使用入门
  12. C++ std::vector 容器 是什么
  13. 安装face_recognition(ModuleNotFoundError: No module named 'face_recognition')
  14. 王招治计算机财务管理,计算机财务管理——以Excel为分析工具
  15. 计算机execl必背知识点,【分享】Excel必备基础知识(1)
  16. python解决八数码问题_python解决八数码问题
  17. python 根据地址求经纬度 谷歌_利用google地图根据地址批量获取经纬度
  18. 2014网络红人照片网络红人排行榜2014经典语录网络红人斌少
  19. AngularJS(2)——AngularJS数据双向绑定
  20. java为word、excel、pdf、ppt、图片添加图片水印(文字水印同理)

热门文章

  1. 剔除字符串中重复的字符
  2. python excel处理模块_Python(00):openpyxl模块处理Excel文件
  3. vs可以编译python_Python如何进行编译和反编译
  4. 详解Android中AsyncTask的使用
  5. Android开发学习之以CameraAPI方式实现相机功能(二)——相机功能配置
  6. Android开发学习之录音同步播放的实现
  7. Tiled编辑器不能打开.tmx文件的问题
  8. finding the way
  9. Hadoop HBase
  10. android 从网络加载图片并显示