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 ...
随机推荐
- 使用Appache部署WEB服务器
Apache的起源(这个就不说了,百度下就都有了) 简介:Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行, ...
- ios微信浏览器click事件不起作用的解决方法
$(document).on( "click", ".weui_cell", function (event) {alert(); }); JS代码是这样的,h ...
- 由浅入深一个Demo带你认识Restful风格的架构
java作为一门后端语言,其厉害之处在于web,大家比较熟知的各种网络应用,java都能做,那么在这个移动优先的时代,如何继续发挥java的强大之处呢? 通常是让java作为一个app的服务端,为ap ...
- Java_静态变量
class c1c { private static int num = 0; private static double pi = 3.14; private double radius; priv ...
- P1309 瑞士轮 未完成 60
题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低,但比赛过程往往十分 ...
- 微信小程序 图片加载失败处理方案
小程序端展示网络资源图片可能会失败,下面介绍一种自己的处理方法 1. js文件中判断图片 url 是否存在,存在则正常显示,不存在则替换url为本地默认图片 2. 当图片 url 存在,但是加载失败时 ...
- Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest(二月十日训练赛)
A(By talker): 题意分析:以a(int) op b(int)形式给出两个整数和操作符, 求两个整数是否存在操作符所给定的关系 ,有则输出true,无则输出false: 思路:由于无时间复杂 ...
- nginx 新手入门
Nginx 是一个高性能的http 和反向代理服务器,也是一个代理服务器. Nginx比Apache 更加轻量级,占用的资源少,抗并发,二apache是阻塞型的,在高并发下,nginx更占优势. 我们 ...
- activiti 表名称的解释
链接:java工作流activiti的步骤 Activiti的后台是有数据库的支持,所有的表都以ACT_开头. 第二部分是表示表的用途的两个字母标识. 用途也和服务的API对应. ACT_RE_*: ...
- Failed to load class “org.slf4j.impl.StaticLoggerBinder”
背景: 在配置使用Hibernate的时候遇到了这个问题, 然后就很头疼. SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerB ...

