POJ-2387Til the Cows Come Home,最短路坑题,dijkstra+队列优化
Time Limit: 1000MS | Memory Limit: 65536K | |
![]() ![]() ![]() ![]() ![]() |
![]() ![]() ![]() ![]() ![]() |
http://poj.org/problem?id=2387
Description
Farmer John's field has N (2 <= N <= 1000) landmarks in it, uniquely numbered 1..N. Landmark 1 is the barn; the apple tree grove in which Bessie stands all day is landmark N. Cows travel in the field using T (1 <= T <= 2000) bidirectional cow-trails of various
lengths between the landmarks. Bessie is not confident of her navigation ability, so she always stays on a trail from its start to its end once she starts it.
Given the trails between the landmarks, determine the minimum distance Bessie must walk to get back to the barn. It is guaranteed that some such route exists.
Input
* Lines 2..T+1: Each line describes a trail as three space-separated integers. The first two integers are the landmarks between which the trail travels. The third integer is the length of the trail, range 1..100.
Output
Sample Input
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
Sample Output
90
Hint
There are five landmarks.
OUTPUT DETAILS:
Bessie can get home by following trails 4, 3, 2, and 1.
Source
最短路A的第一道题,做了一天还是看讨论区才做出来的,,不过不看讨论区准被坑死。
题意很简单,n个点,t条路,求1到n的最短路,用dijkstra就可以了,其他的也一样,只不过没想到会有重边的情况,这样用弗洛伊德算法直接过,但对于迪杰斯特拉稍加修改即可以;还需注意的是无向图,这样用邻接矩阵的方法就可以了;但开始提交老是RE,看讨论区才发现这个神坑,先输入t再输入n,无限RE无限WA。。。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1000+10;
int v[N];
int d[N],w[N][N];
int main()
{
int n,t,i,j;
while(~scanf("%d%d",&t,&n))
{
memset(v,0,sizeof(v));
for(i=1;i<=n;i++)
d[i]=(i==1?0:INF);//d[i]表示初始点到i点的最短距离,这里先初始化;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
w[i][j]=INF;//表示这条边不存在;
int a,b,c;
for(i=0;i<t;i++)
{
scanf("%d%d%d",&a,&b,&c);
w[a][b]=w[b][a]=min(w[a][b],c);//邻接矩阵解决重边问题;
}
for(i=1;i<=n;i++)
{
int x,m=INF;
for(j=1;j<=n;j++)
if(!v[j]&&d[j]<=m)
m=d[x=j];
v[x]=1;//标记已访问过;
for(j=1;j<=n;j++)
d[j]=min(d[j],d[x]+w[x][j]);//这里蛮好懂的,整个算法看起来不难,但要灵活运用就不简单了;
}
printf("%d\n",d[n]);
}
return 0;
}
以下内容续写于2016.9.3 22:30;
花了几天时间理解了用对列优化的dijstra,整理出了适合自己的代码。具体要完全靠自己实现是那么难,嗯,继续加油!
此题由于有重边的情况,想不出什么方法解决,所以开了二维邻接矩阵来存图,具体来看代码加详解:
typedef long long ll;
const int INF=0x3f3f3f3f;
const int N=10000+10;
int n,m,s,e;
int d[N],vis[N],w[N][N];
vector<int>g[N];//存邻接点;
typedef pair<int,int>pii;//优先队列pair型优先比较第一维;
void dij()
{
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++) d[i]=i==1?0:INF;
priority_queue<pii,vector<pii>,greater<pii> >q;
while(!q.empty()) q.pop();
q.push(make_pair(d[1],1));//将起点加入队列;
while(!q.empty())//时间复杂度mlog(m);
{
pii temp=q.top();
q.pop();
int u=temp.second;
if(vis[u]) continue;
vis[u]=1;
for(int i=0; i<g[u].size(); i++)
if(d[g[u][i]]>d[u]+w[u][g[u][i]])
{
d[g[u][i]]=d[u]+w[u][g[u][i]];
q.push(make_pair(d[g[u][i]],g[u][i]));//将邻接点加入队列,有点类似广搜。
}
}
printf("%d\n",d[n]);
}
int main()
{
while(~scanf("%d%d",&m,&n))
{
for(int i=1; i<N; i++) g[i].clear();
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
w[i][j]=i==j?0:INF;
int u,v,c;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&u,&v,&c);
w[v][u]=w[u][v]=w[u][v]==INF?c:min(w[u][v],c);//邻接矩阵是为了避免有重边的情况,但增加了空间复杂度;
g[u].push_back(v);
g[v].push_back(u);//此条语句适用双向边的情况;
}
// scanf("%d%d",&s,&e);//起点终点;
dij();
}
return 0;
}
POJ-2387Til the Cows Come Home,最短路坑题,dijkstra+队列优化的更多相关文章
- HDU 2544 最短路(floyd+bellman-ford+spfa+dijkstra队列优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找点1到点n的最短路(无向图) 练一下最短路... dijkstra+队列优化: #i ...
- POJ 2387 Til the Cows Come Home --最短路模板题
Dijkstra模板题,也可以用Floyd算法. 关于Dijkstra算法有两种写法,只有一点细节不同,思想是一样的. 写法1: #include <iostream> #include ...
- Til the Cows Come Home(最短路模板题)
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Description Bessie is ...
- POJ 1874 畅通工程续(最短路模板题)
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- POJ 1062 昂贵的聘礼(最短路中等题)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 51879 Accepted: 15584 Descripti ...
- 最短路模板[spfa][dijkstra+堆优化][floyd]
借bzoj1624练了一下模板(虽然正解只是floyd) spfa: #include <cstdio> #include <cstring> #include <alg ...
- POJ-2387 Til the Cows Come Home ( 最短路 )
题目链接: http://poj.org/problem?id=2387 Description Bessie is out in the field and wants to get back to ...
- poj 2456 Aggressive cows && nyoj 疯牛 最大化最小值 二分
poj 2456 Aggressive cows && nyoj 疯牛 最大化最小值 二分 题目链接: nyoj : http://acm.nyist.net/JudgeOnline/ ...
- POJ 2456 Agressive cows(二分)
POJ 2456 Agressive cows 农夫 John 建造了一座很长的畜栏,它包括N (2≤N≤100,000)个隔间,这 些小隔间的位置为x0,...,xN-1 (0≤xi≤1,000,0 ...
随机推荐
- [转]Linq 如何实现 in 与 not in
本文转自:http://blog.csdn.net/zhangyumei/article/details/5620363 接触 LINQ 也有很长的一段时间了,有些在 SQL 语句中用的很顺手的东西在 ...
- android开发学习 ------- Error:Failed to open zip file.
我们用Android Studio Sync Project项目的时候,会出现如下的错误: 解决方案: Project视图下, 这块 https 改为 http 就可以了.
- 2018微软实习笔试一道dp题目总结
题意大概是说在一维数轴上起点和终点的距离是d,现在我们要从起点走到终点.每走一个单位长度消耗一个单位能量,初始时有K单位能量.同时在起点和终点之间分布一些加油站a1,a2,...an,给你加油站数量. ...
- 让WPS10显示为offic97效果
让WPS10显示为offic97效果2019/1/26 22:02 OS:win7 64位使用的WPS_10.1.0.5603_setup.1460689247.exe 衣不如旧,人不如新.最开始接触 ...
- Java Web开发之Spring | SpringMvc | Mybatis | Hibernate整合、配置、使用
1.Spring与Mybatis整合 web.xml: <?xml version="1.0" encoding="UTF-8"?> <web ...
- Java递归调用改成非递归
在java语言中,使用递归调用时,如果过多的调用容易造成java.lang.StackOverflowError即栈溢出和程序执行过慢.这是一个潜在Bug和影响程序执行效率问题,需要谨慎使 ...
- PHP中session和cookie的区别
这个话题无论是系统运维还是PHP开发人员面试时会经常遇到,所以这里也进行一些总结和归纳,session和cookie的具体理论网上比较大,大家googel下均可;系统运维注意区分下session(会话 ...
- 响应式布局(CSS3弹性盒flex布局模型)
传统的布局方式都是基于盒模型的 利用display.position.float来布局有一定局限性 比如说实现自适应垂直居中 随着响应式布局的流行,CSS3引入了更加灵活的弹性布局模型 flex弹性布 ...
- Python3简明教程(十二)—— 模块
在这节我们将要学习 Python 模块相关知识.包括模块的概念和导入方法,包的概念和使用,第三方模块的介绍,命令行参数的使用等. 模块 到目前为止,我们在 Python 解释器中写的所有代码都在我们退 ...
- scroll offset & client总结
oEvent.clientX 是指鼠标到可视区左边框的距离. oEvent.clientY 是指鼠标到可视区上边框的距离. clientWidth 是指可视区的宽度. clientHeight 是 ...