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 ...
随机推荐
- spark Listener和metrics实现分析
在spark内部,rpc可以用来实现不同组件(Driver, executor,client)之间的远程交互.而在同一组件内,spark还有事件监听机制,如spark中各种指标的采集主要就是通过事件监 ...
- JS执行保存在数据库中的JS代码
function createScript(script) { var myScript = document.createElement("script"); myScript. ...
- sql注入原理及解决方案
sql注入原理 sql注入原理就是用户输入动态的构造了意外sql语句,造成了意外结果,是攻击者有机可乘 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的 ...
- 分层开发之C#分层
假如没有用分层开发,仔细分析三人的开发过程,很容易发现其中的问题: >三人排队式的轮番工作,花费的时间是三人工作时间之和. >后面开发的人基本都是要先花费时间熟悉前面人的代码,否则开发难以 ...
- Tomcat+Jenkins+SonarQube+SVN+Maven 集成自动化环境搭建(Windows10环境下)
说在前面的话: 从接到任务到完成共用了7天的时间.正常人用不到这个时间. 此时的功能表现是: 登录本地JenKins对项目进行构建,能够自动从SVN读取最新代码并按照Maven项目构建,构建完成能够自 ...
- Java_面向对象中的this和super用法
this: 1.使用在类中,可以用来修饰属性.方法.构造器 2.表示当前对象或者是当前正在创建的对象 3.当形参与成员变量重名时,如果在方法内部需要使用成员变量,必须添加 this 来表明该变量时类成 ...
- java只http改成https访问
目录 生成keystore文件 修改tomcat中的server.xml文件 配置浏览器 生成keystore文件: 1.在tomcat的bin 目录下输入命令:keytool -genkeypair ...
- Ubuntu16下查看CPU、内存和磁盘相关信息
1.内存 查看内存#free -m total used free shared buff/cache available Mem: Swap: 2.CPU 查看逻辑cpu个数: #cat /proc ...
- Axure-计算输入字数
说明:Axure版本为7.0 1.添加多行文本框,设置名称为Input,添加文本框,设置名称为msg,样式如下: 2.为input添加“文本改变时”事件,设置全局变量,如下所示: 3.再添加“设置文本 ...
- [Python3]Python官方文档-Python Manuals
简介 一般情况下,初学者都不愿意直接去浏览Python Manuals,即Python自带的官方文档.尤其是只有英文版的情况下,初学者更加不会去使用该官方文档了. 在这里笔者强力推荐初学者经常学会使用 ...

