pku 2387 Til the Cows Come Home
原来一直没去学spfa,感觉只一个Dij已经很够用了,昨天翻了一下最短路,如果路径中存在负权的话,Dij也只能素手无策,这时spfa就大显身手了。。
实现过程:
我们用数组d记录每个结点的最短路径估计值,而且用邻接表来存储图G。我们采取的方法是松弛:
设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,
并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,
且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。
这道题很明显的最短路,分别用两个版本写了下。
spfa:
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:
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相关推荐
- POJ 2387 Til the Cows Come Home (最短路径 模版题 三种解法)
原题链接:Til the Cows Come Home 题目大意:有 个点,给出从 点到 点的距离并且 和 是互相可以抵达的,问从 到 的最短距离. 题目分析:这是一道典型的最短路径模版 ...
- Poj 2387 Til the Cows Come Home 迪杰斯特拉(普通+优化)
Til the Cows Come Home 迪杰斯特拉(普通+优化) 贝西在田里,想在农夫约翰叫醒她早上挤奶之前回到谷仓尽可能多地睡一觉.贝西需要她的美梦,所以她想尽快回来. 农场主约翰的田里有n( ...
- POJ 2387 Til the Cows Come Home
传送门:http://poj.org/problem?id=2387 这是最短路径问题,本题有重边,但是spfa能解决这个问题: 实现代码: SPFA: 1 #include <iostream ...
- 【POJ】2387 Til the Cows Come Home
题目链接:http://poj.org/problem?id=2387 题意:求从1到n的最短路 题解:板子题.spfa. 代码: 1 #include<iostream> 2 #incl ...
- POJ - 2387 Til the Cows Come Home
感觉一直写的dij堆优化都是假的,最短路板子spfa+ dij堆优化 SPFA #include<stdio.h> #include<string.h> #include< ...
- poj 2387 Til the Cows Come Home dijkstra
题意: 贝西在田里,想在农夫约翰叫醒她早上挤奶之前回到谷仓尽可能多地睡一觉.贝西需要她的美梦,所以她想尽快回来. 农场主约翰的田里有n(2<=n<=1000)个地标,唯一编号为1-n.地标 ...
- A - Til the Cows Come Home POJ - 2387
A - Til the Cows Come Home POJ - 2387 最短路 #include<iostream> #include<cstdio> #include&l ...
- 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 ...
- Til the Cows Come Home(简单的最短路)
Til the Cows Come Home Bessie 在外地,想要在 Farmer John 叫醒她早上挤奶之前回到谷仓尽可能多地睡觉.Bessie 需要她的美容觉,所以她想尽快回来. Farm ...
最新文章
- 按属性对自定义对象的ArrayList进行排序
- 六、MySql索引分类
- laravel auth login 重定向自定义_Laravel学习之路(一):最简单的API 认证(Passport)实践...
- C#常用控件的属性以及方法(转载)
- fpga如何约束走线_如何正确的约束时钟—Vivado优化到关键路径
- vue图片点击超链接_10秒钟,告别ppt中难看的超链接
- python二级考试真题_全国BIM技能等级考试真题全套(一/二级,全专业,28套)
- lambda qt 参数 槽函数_C++中的lambda表达式用法
- usb耳机android,USB 耳机:配件规范 | Android 开源项目 | Android Open Source Project...
- mysql增加列并增加comment_运城多条高铁线路调整动车列数增加到99列
- j2ee 简单网站搭建:(十一)ckeditor 控件使用入门
- C++ std::vector 容器 是什么
- 安装face_recognition(ModuleNotFoundError: No module named 'face_recognition')
- 王招治计算机财务管理,计算机财务管理——以Excel为分析工具
- 计算机execl必背知识点,【分享】Excel必备基础知识(1)
- python解决八数码问题_python解决八数码问题
- python 根据地址求经纬度 谷歌_利用google地图根据地址批量获取经纬度
- 2014网络红人照片网络红人排行榜2014经典语录网络红人斌少
- AngularJS(2)——AngularJS数据双向绑定
- java为word、excel、pdf、ppt、图片添加图片水印(文字水印同理)