hdu2544 迪杰斯特拉题目优化
迪杰斯特拉的用法不多讲,详见 点击打开链接 。
下面两个代码:
这个是用邻接矩阵存图的迪杰斯特拉。
#include<stdio.h>
int main()
{ int e[1005][1005],dis[1005],book[1005],i,j,n,m,t1,t2,t3,u,v,min;
int inf=9999999;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(m==n&&n==0) return 0;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(i==j) e[i][j]=0;
else e[i][j]=inf; }
}
for(i=1; i<=m; i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
e[t1][t2]=e[t2][t1]=t3;
}
for(i=1; i<=n; i++)
{
dis[i]=e[1][i];
}
for(i=0; i<=n; i++)
{
book[i]=0;
}
book[1]=1; for(i=1; i<n; i++)
{
min=inf;
for(j=1; j<=n; j++)
{
if(book[j]==0&&dis[j]<min)
{
min=dis[j];
u=j; }
}
book[u]=1;
for(v=1; v<=n; v++)
{
if(e[u][v]<inf)
if(dis[v]>dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
} }
// for(i=1; i<=n; i++)
printf("%d\n",dis[n]);
}
return 0;
}
用数组模拟邻接表的迪杰斯特拉:数组模拟邻接表详见 点击打开链接
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAX_SIZE 10005
const int INF=2e9+1e8; int start[MAX_SIZE],terminal[MAX_SIZE],value[MAX_SIZE];
int first[MAX_SIZE],nexts[MAX_SIZE],dis[MAX_SIZE],vis[MAX_SIZE];
int main()
{
int n,m,i,j,minn,k;
while(scanf("%d %d",&n,&m)!=EOF) // n个点m条边
{
if(n==m&&m==0) return 0;
for(i=1; i<=n; i++) // 初始化 first 数组
first[i]=-1;
for(i=1; i<=m; i++) // 存入m条边
{
int ss,ee,vv;
scanf("%d %d %d",&ss,&ee,&vv); start[i*2-1]=ss,terminal[i*2-1]=ee,value[i*2-1]=vv;
nexts[i*2-1]=first[start[i*2-1]];
first[start[i*2-1]]=i*2-1; start[i*2]=ee,terminal[i*2]=ss,value[i*2]=vv;
nexts[i*2]=first[start[i*2]];
first[start[i*2]]=i*2;
}
// 初始化 dis 数组
k=first[1];
for(i=1; i<=n; i++)
dis[i]=INF;
while(k!=-1)
{
dis[terminal[k]]=value[k];
k=nexts[k];
}
memset(vis,0,sizeof(vis)); // 标记当前位置是否来过 0 表示还没有来过
vis[1]=1;
int mid_pos;
int times=n-1;
// 迪杰斯特拉 核心代码
while(times--)
{
minn=INF;
for(j=1; j<=n; j++)
{
if(vis[j]==0&&dis[j]<minn)
{
minn=dis[j];
mid_pos=j;
}
}
if(minn==INF) continue;
vis[mid_pos]=1;
// 遍历 pos 点能到的地方
k=first[mid_pos];
while(k!=-1)
{
if(dis[mid_pos]+value[k]<dis[terminal[k]]) dis[terminal[k]]=dis[mid_pos]+value[k];
k=nexts[k];
}
}
// for(i=1; i<=n; i++)
// printf("%d ",dis[i]);
// printf("\n");
printf("%d\n",dis[n]);
}
return 0;
}
hdu2544 迪杰斯特拉题目优化的更多相关文章
- CodeForces - 449B 最短路(迪杰斯特拉+堆优化)判断最短路路径数
题意: 给出n个点m条公路k条铁路. 接下来m行 u v w //u->v 距离w 然后k行 v w //1->v 距离w 如果修建了铁路并不影响两点的最短距离, ...
- Bumped!【迪杰斯特拉消边、堆优化】
Bumped! 题目链接(点击) Peter returned from the recently held ACM ICPC World Finals only to find that his r ...
- bfs输出路径 && 最短路(迪杰斯特拉)输出路径
问题描述 解决方法 1.像第一个问题那就是最短路问题(我代码采用迪杰斯特拉算法)实现 2.换乘次数最少,那就用bfs广搜来寻找答案.但是我的代码不能保证这个最少换乘是最短路程 代码 1 #includ ...
- 最短路径-迪杰斯特拉(dijkstra)算法及优化详解
简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...
- 迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少
首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...
- 说说关于洛谷P4779迪杰斯特拉的堆优化
众所周知,这题必须要用堆优化的迪杰斯特拉的堆优化才能过,否则60分(错失一等奖) 我没有得过一等奖但还是要说: P4779 全过程: struct node//堆中的比较函数 { int dis; i ...
- Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉
Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...
- HDU 2680 最短路 迪杰斯特拉算法 添加超级源点
Choose the best route Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- 最短路——迪杰斯特拉算法 HDU_3790
初识最短路,今天只弄了一个迪杰斯特拉算法,而且还没弄成熟,只会最基本的O(n^2),想弄个优先队列都发现尼玛被坑爆了,那个不应该用迪杰斯特拉算法写 表示还是不会优化版的迪杰斯特拉算法,(使用优先队列) ...
随机推荐
- 图说OSI七层网络模型
开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型(OSI model),一种概念模型,由国际 ...
- ROS安装环境配置及多版本的切换
环境配置: 为方便起见,我们可以在每次打开终端时让系统自动配置好ROS环境变量,方法如下: echo "source /opt/ros/hydro/setup.bash" > ...
- 51 NOD 1325 两棵树的问题
Discription 对于 100% 的数据, N<=50. solution: 发现N比较小,所以我们可以花O(N^2)的代价枚举两颗树的联通块的LCA分别是哪个点,然后现在问题就变成了:选 ...
- Cesium调用Geoserver发布的 WMS、WFS服务
1 GeoServer服务发布 1.1 WMS服务 下载GeoServer安装版安装,同时安装geopackage扩展,以备使用.使用XX地图下载器下载地图,导出成GeoPackage地图文件. (1 ...
- 第二讲_图像数据处理Image Data Processing
第二讲_图像数据处理Image Data Processing 深度模型出现后被弱化,但是思想的影子在深度模型中可以看到的 图片存储原理 RGB颜色空间:三通道(b,g,r),加法混色 CMY(K): ...
- BUPT复试专题—寻找第 K 小的数(2009)
题目描述 给你 n 个完全不相同整数(n<=300),每一个数都大于 0 并且小于 1000,请找出 第 k 小的数. 输入 输入包括两行,第一行用空格隔开的两个数 n 和 k;第二行有 n 个 ...
- sshd登录攻击
先说简单的防范措施: 1.密码足够复杂 密码的长度大于8位.有数字.大小写字母.特殊字符组合. 2.nmap 扫描 为了避免被扫描到, #看到端口是81 ssh root@192.168.1.63 玩 ...
- 关于HTML中文乱码问题
系统:ubuntu 14.04 软件:bluefish 一.乱码原因 1.不同编码内容混杂:HTML乱码是因为html编码问题照成(常见gb2312与utf-8两种编码内容同一时候存在照成) 2.未设 ...
- JavaScript与Java通信
1.WebView中JavaScript调用Android程序中Java: 使用WebView类中的addJavascriptInterface()方法,能够使用它扩展嵌入式浏览器内的DOM(文档对象 ...
- sql之浅谈视图的作用
[数据库]☆★sql之浅谈视图的作用 在一个项目的实际开发过程中牵涉到复杂业务的时候,我们不可避免的须要使用中间表来进行数据连接,有的同学就说了,我能够採用Hibernate进行主外键进行关联啊?多对 ...