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 ...
随机推荐
- python正则表达式多次提取数据(一个规则提取多组数据)
import re ttt='"FileName":"陈雪凝 - <em>绿色<\/em>","AlbumID":& ...
- C++ <string> 里面的size_type
string::size_type string的 str.size() 返回值是一个unsigned,实际上返回的是size_type类型的值. string类和其他的大多数标准库类型都定义了几套配 ...
- 生成HTML表格的后台模板代码
有时候,我们需要在后台拼接生成前端的html表格,一般的做法就是各种string.StringBuilder的拼接(例子省略...),这样的话如果表头不同就没法做到代码的重用,增加代码的冗余,下面我分 ...
- ASP.NET MVC5的一个轻量级的框架学习的第一天
第二步第三部 这是第一天的小试成功,怪自己太笨了,一个错排查好久,还好有源码看着了解,后续还得多努力,
- LN : leetcode 684 Redundant Connection
lc 684 Redundant Connection 684 Redundant Connection In this problem, a tree is an undirected graph ...
- hihocoder offer收割编程练习赛9 B 水陆距离
思路: 宽搜,多个起点. 实现: #include <iostream> #include <cstdio> #include <algorithm> #inclu ...
- DOM编程练习(慕课网题目)
编程练习 制作一个表格,显示班级的学生信息. 要求: 1. 鼠标移到不同行上时背景色改为色值为 #f2f2f2,移开鼠标时则恢复为原背景色 #fff 2. 点击添加按钮,能动态在最后添加一行 3. 点 ...
- FPGA开发中的脚本语言
多数FPGA开发者都习惯图形化界面(GUI).GUI方式简单易学,为小项目提供了一键式流程.然而,随着FPGA项目越来越复杂,在很多情况下GUI工具就阻碍了工作效率.因为GUI工具不能对整个开发过程提 ...
- 在phpnow中配置phpunit
前面都好了之后,在 D:\phpnow\php-5.2.14-Win32\PEAR 之外的地方执行 phpinfo 都会出现以下错误 Warning: require_once(File/Iterat ...
- 合并百度影音的离线数据 with python 2.3 格式更新
很久没有更新了. 这次新增支持四种格式的解析. filelist slicelist download.cfg third_party_download.cfg 还是2个文件.替换之前版本即可. 初步 ...

