Til the Cows Come Home 迪杰斯特拉(普通+优化)

贝西在田里,想在农夫约翰叫醒她早上挤奶之前回到谷仓尽可能多地睡一觉。贝西需要她的美梦,所以她想尽快回来。

农场主约翰的田里有n(2<=n<=1000)个地标,唯一编号为1..n。地标1是谷仓;贝西整天站在其中的苹果树林是地标n。奶牛在田里行走时使用地标间不同长度的T(1<=t<=2000)双向牛道。贝西对自己的导航能力没有信心,所以一旦开始,她总是沿着一条从开始到结束的路线行进。

根据地标之间的轨迹,确定贝西返回谷仓必须走的最小距离。这样的路线一定存在。

解题思路

这个题是很典型的最短路问题,并且给了起点和终点,所以使用Dijkstra算法来解决单源最短路问题。

Dijkstra算法我这有两种形式,一种是普通的邻接矩阵法,复杂度是\(O(n^2)\),n是顶点的个数

然而使用邻接表和优先队列的形式,可以将复杂度优化到\(O(m*logn)\),m是边的个数,但是这种一般适用于稀疏图,对于稠密图,这种优化算法可能比原来没有优化的复杂度还要高。参考《算法竞赛入门经典(第二版)》360页

代码实现

//普通的临界矩阵算法
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int inf=0x3f3f3f3f;
const int maxn=1e3+7;
int mp[maxn][maxn];
int dis[maxn];
int vis[maxn];
int t, n;void dij()
{for(int i=1; i<=n; i++){dis[i]=mp[1][i];}vis[1]=1;for(int i=1; i<n; i++){int tmp=inf, k;for(int j=1; j<=n; j++){if(!vis[j] && dis[j]<tmp){tmp=dis[j];k=j;}}vis[k]=1;for(int j=1; j<=n; j++){if(!vis[j] && dis[j] > dis[k]+mp[k][j])dis[j]=dis[k] + mp[k][j];}}
}void init()
{for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){if(i!=j) mp[i][j]=inf;else mp[i][j]=0;    }       }fill(vis+1, vis+n+1, 0);fill(dis+1, dis+n+1, inf);
}
int main()
{while(scanf("%d%d", &t, &n)!=EOF){int a, b, c;init();for(int i=1; i<=t; i++){scanf("%d%d%d", &a, &b, &c);if(c < mp[a][b]){mp[a][b]=c;mp[b][a]=c;}}dij();printf("%d\n", dis[n]);}return 0;} 
//邻接表+优先队列优化
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=1e3+7;
const int maxe=2e3+7;
const int inf=0x3f3f3f3f;
struct edge{int to, cost;
};
struct headnode{int d, u;bool friend operator < (const headnode a, const headnode b){return a.d > b.d; //使用大于号是因为在优先队列中默认是从大到小的,这里需要反过来,从小到大。}
};
int dis[maxn];
int vis[maxn];
vector<edge> g[maxn];
priority_queue<headnode> que;
int t, n;
void init()
{for(int i=1; i<=n; i++){g[i].clear();vis[i]=0;dis[i]=inf;}while(!que.empty()) que.pop();
}
void dij(int s)
{int u;edge e;dis[s]=0;headnode tmp={0, s};headnode next;que.push(tmp);while(!que.empty()){tmp=que.top();que.pop();u=tmp.u;if(vis[u]==1) continue;vis[u]=1;for(int i=0; i<g[u].size(); i++){e=g[u][i];if(dis[e.to] > dis[u]+e.cost){dis[e.to]=dis[u]+e.cost;next.d=dis[e.to];next.u=e.to;que.push(next);}}}
}
int main()
{while(scanf("%d%d", &t, &n)!=EOF){init();int a, b, c;edge e;for(int i=1; i<=t; i++){scanf("%d%d%d", &a, &b, &c);e.to=b;e.cost=c;g[a].push_back(e);e.to=a;e.cost=c;g[b].push_back(e);}dij(1);printf("%d\n", dis[n]);}return 0;
} 

转载于:https://www.cnblogs.com/alking1001/p/11268063.html

Poj 2387 Til the Cows Come Home 迪杰斯特拉(普通+优化)相关推荐

  1. 【讲解 + 模板】Dijkstra迪杰斯特拉+堆优化

    Dijkstra迪杰斯特拉+堆优化 众所周知,朴素的迪杰斯特拉的时间复杂度为O(n^2),这在某些题目当中是会超时的.但如果在迪杰斯特拉中枚举每个最短边时加入堆优化,则迪杰斯特拉的效率则会大大提高. ...

  2. 7-38 社交网络图中结点的“重要性”计算 (30分) 最短路 迪杰斯特拉堆优化

    在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱.而结点根据其所处的位置不同,其 ...

  3. 【迪杰斯特拉的优化】 洛谷4779板子题

    P4779 [模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 最终,他 ...

  4. poj 2244 最短路 和 poj 1874 畅通工程续 dijkstra(迪杰斯特拉)

    畅通工程续,题目链接,点击这里, 畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...

  5. 迪杰斯特拉算法优化(dijkstra)

    dijkstra常规实现方式:迪杰斯特拉算法(dijkstra)https://blog.csdn.net/weixin_48898946/article/details/120990493 这里主要 ...

  6. POJ 2387 Til the Cows Come Home (最短路径 模版题 三种解法)

    原题链接:Til the Cows Come Home 题目大意:有  个点,给出从  点到  点的距离并且  和  是互相可以抵达的,问从  到  的最短距离. 题目分析:这是一道典型的最短路径模版 ...

  7. POJ 2387 Til the Cows Come Home

    传送门:http://poj.org/problem?id=2387 这是最短路径问题,本题有重边,但是spfa能解决这个问题: 实现代码: SPFA: 1 #include <iostream ...

  8. POJ - 2387 Til the Cows Come Home

    感觉一直写的dij堆优化都是假的,最短路板子spfa+ dij堆优化 SPFA #include<stdio.h> #include<string.h> #include< ...

  9. poj 2387 Til the Cows Come Home dijkstra

    题意: 贝西在田里,想在农夫约翰叫醒她早上挤奶之前回到谷仓尽可能多地睡一觉.贝西需要她的美梦,所以她想尽快回来. 农场主约翰的田里有n(2<=n<=1000)个地标,唯一编号为1-n.地标 ...

最新文章

  1. 三极管在ad中的原理图库_555时基电路内部结构及其工作原理
  2. android播放页蒙层过渡效果,EasyGuideLayer: 这可能是最简单、灵活、强大的页面蒙层组件了!...
  3. 【C 语言】文件操作 ( 按照单个字符的方式读写文件 | fgetc 函数 | fputc 函数 )
  4. troubleshoot之:用control+break解决线程死锁问题
  5. Mac下好用的批量文件扩展名修改工具
  6. java file 对象_Java里File对象的问题。
  7. 威海二职工业机器人专业_工业机器人专业就业前景-山东省好的中专学校
  8. python3主函数返回值_Python3
  9. iOS中网络请求的使用(GET请求与POST请求)
  10. 假如我结婚以后父母把房子过户到我一人名下,属于夫妻共同财产嘛?
  11. ds18b20温度转换指令_学习心得 | 温度检测工程模块划分总结与案例分析
  12. Android data分区格式F2FS改为EXT4
  13. Bootstrap文字排版
  14. 基于AD5933 生物复阻抗
  15. 第三章 Guarded Suspension模式 等我准备好哦
  16. vs2017 自定义背景图片
  17. 计算机视觉 响应_视觉响应式布局的自动化测试
  18. 生活随记 - 念念不忘
  19. 浏览器兼容问题(实战干货)
  20. python设置散点图点的大小_Python散点图 . 标记的大小和样式

热门文章

  1. 艾司博讯:拼多多开专营店需要多少保证金
  2. 运维体系 ------ 技术运营
  3. 查看指定端口的占用情况
  4. 运动学习与控制 示范与口授
  5. 雷军:没想到红米会如此火 芯片也应免费
  6. 全国流域水系数据大全(附下载地址)
  7. Python 手写数字识别-1
  8. win7计算机字体大小怎么设置,新手使用win7系统中设置桌面的字体大小的方法
  9. 《剑指offer 阅读笔记一》程序员面试流程,面试游刃有余
  10. mv命令——移动或重命名文件