Til the Cows Come Home
Time Limit: 1000MS   Memory Limit: 65536K
     

http://poj.org/problem?id=2387

Description

Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes her for the morning milking. Bessie needs her beauty sleep, so she wants to get back as quickly as possible. 



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

* Line 1: Two integers: T and N 



* 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

* Line 1: A single integer, the minimum distance that Bessie must travel to get from landmark N to landmark 1.

Sample Input

5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100

Sample Output

90

Hint

INPUT DETAILS: 



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+队列优化的更多相关文章

  1. HDU 2544 最短路(floyd+bellman-ford+spfa+dijkstra队列优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找点1到点n的最短路(无向图) 练一下最短路... dijkstra+队列优化: #i ...

  2. POJ 2387 Til the Cows Come Home --最短路模板题

    Dijkstra模板题,也可以用Floyd算法. 关于Dijkstra算法有两种写法,只有一点细节不同,思想是一样的. 写法1: #include <iostream> #include ...

  3. Til the Cows Come Home(最短路模板题)

    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description Bessie is ...

  4. POJ 1874 畅通工程续(最短路模板题)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  5. POJ 1062 昂贵的聘礼(最短路中等题)

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 51879   Accepted: 15584 Descripti ...

  6. 最短路模板[spfa][dijkstra+堆优化][floyd]

    借bzoj1624练了一下模板(虽然正解只是floyd) spfa: #include <cstdio> #include <cstring> #include <alg ...

  7. 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 ...

  8. poj 2456 Aggressive cows && nyoj 疯牛 最大化最小值 二分

    poj 2456 Aggressive cows && nyoj 疯牛 最大化最小值 二分 题目链接: nyoj : http://acm.nyist.net/JudgeOnline/ ...

  9. POJ 2456 Agressive cows(二分)

    POJ 2456 Agressive cows 农夫 John 建造了一座很长的畜栏,它包括N (2≤N≤100,000)个隔间,这 些小隔间的位置为x0,...,xN-1 (0≤xi≤1,000,0 ...

随机推荐

  1. selenium2+python自动化1-操作浏览器

    随着测试行业的发展,现在不论在找工作还是在实际的工作中,对要求掌握自动化越来越普遍,在这里就记录一下一些入门的知识,希望对阅读者能有一些帮助吧!好哒,步入正题,这一篇主要记录下如何用Python调用w ...

  2. Web service简介 与servletContext的参数

    Web service顾名思义是基于web的服务,它是一种跨平台,跨语言的服务. 我们可以这样理解它,比如说我们可以调用互联网上查询天气信息的web服务,把它嵌入到我们的B/S程序中,当用户从我们的网 ...

  3. php数组与字符串转换

    1.将字符串转换成数组的几个函数: (1)explode(separate,string) 示例:$str = "Hello world It's a beautiful day" ...

  4. P2667 超级质数

    https://www.luogu.org/problem/show?pid=2667 题目背景 背景就是描述,描述就是背景...... 题目描述 一个质数如果从个位开始,依次去掉一位数字,两位数字, ...

  5. Win10 隐藏盘符

    1.隐藏盘符 打开磁盘管理 -> 对要隐藏的盘符单击右键 -> 更改驱动器号和路径 -> 删除. 打开资源管理,已经看不到该盘符,该盘符已被隐藏.只是隐藏,该盘符上的数据仍然还在. ...

  6. LN : leetcode 486 Predict the Winner

    lc 486 Predict the Winner 486 Predict the Winner Given an array of scores that are non-negative inte ...

  7. How `new’ operator works ?

    这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=15 February 15, 2013 How `new’ operator ...

  8. python * urllib_urlopen( )

    python * urllib_urlopen( ) Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据. 一.urllib模块urlop ...

  9. 【C++】双边滤波器(bilateral filter)

    Bilateral Filtering for Gray and Color Images 双边滤波器:保留边界的平滑滤波器. 在局部上,就是在灰度值差异不大的区域平滑,在灰度值差异比较大的边界地区保 ...

  10. app支付宝授权登录获取用户信息

    由后台进行地址的拼接(前台进行授权) // 生成授权的参数 String sign = ""; Long userId1 = SecurityUser.getUserId(); S ...