点击打开题目链接

迪杰斯特拉的用法不多讲,详见  点击打开链接 。

下面两个代码:

这个是用邻接矩阵存图的迪杰斯特拉。

#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 迪杰斯特拉题目优化的更多相关文章

  1. CodeForces - 449B 最短路(迪杰斯特拉+堆优化)判断最短路路径数

    题意: 给出n个点m条公路k条铁路. 接下来m行 u v w      //u->v 距离w 然后k行 v w         //1->v 距离w 如果修建了铁路并不影响两点的最短距离, ...

  2. Bumped!【迪杰斯特拉消边、堆优化】

    Bumped! 题目链接(点击) Peter returned from the recently held ACM ICPC World Finals only to find that his r ...

  3. bfs输出路径 && 最短路(迪杰斯特拉)输出路径

    问题描述 解决方法 1.像第一个问题那就是最短路问题(我代码采用迪杰斯特拉算法)实现 2.换乘次数最少,那就用bfs广搜来寻找答案.但是我的代码不能保证这个最少换乘是最短路程 代码 1 #includ ...

  4. 最短路径-迪杰斯特拉(dijkstra)算法及优化详解

    简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...

  5. 迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

    首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...

  6. 说说关于洛谷P4779迪杰斯特拉的堆优化

    众所周知,这题必须要用堆优化的迪杰斯特拉的堆优化才能过,否则60分(错失一等奖) 我没有得过一等奖但还是要说: P4779 全过程: struct node//堆中的比较函数 { int dis; i ...

  7. Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉

    Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  8. HDU 2680 最短路 迪杰斯特拉算法 添加超级源点

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  9. 最短路——迪杰斯特拉算法 HDU_3790

    初识最短路,今天只弄了一个迪杰斯特拉算法,而且还没弄成熟,只会最基本的O(n^2),想弄个优先队列都发现尼玛被坑爆了,那个不应该用迪杰斯特拉算法写 表示还是不会优化版的迪杰斯特拉算法,(使用优先队列) ...

随机推荐

  1. hdu 4849

    简单题,公式计算+最短路.注意点:注意1 取模,2 数组开到n*n+n. #include<iostream> #include<queue> using namespace ...

  2. 【深入Java虚拟机】之六:Java语法糖

    语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家Peter.J.Landin发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使 ...

  3. PERL 源码 大神网站

    http://blog.csdn.net/haoyujie/article/category/1187883 http://deepfuture.iteye.com/blog/816428

  4. 微信公众账户的开发者模式(一) 部分细节access_token的获取等

    十四老久没有写博客了,中间经历了,事业,感情的几分波折.现在终于稍微缓过来一点.又是一次从头开始,走在匆忙的路上. 好了煽情完了,直接上代码了. 基础就不说了我用的是vs2005开发的,部署在iis6 ...

  5. Android Studio一些常用的快捷键

    光标移动和窗口切换:1.esc:光标从功能窗口回到编辑窗口 2.alt+num:打开指定的功能窗口,重复操作关闭该窗口. 3.alt+←→:切换编辑的文件. 4.ctrl+home/end:跳转到文件 ...

  6. flask-limiter限制单个IP访问的频率和次数

    Flask-Limiter provides rate limiting features to flask routes. It has support for a configurable bac ...

  7. C++字符串转数字,数字转字符串

    1. 字符串转数字 如将"32"转为32,将"3.1415"转为3.1415,将"567283"转为567283.使用: //Convert ...

  8. js中有包装类,java中也有包装类

    new Number() vs Number() What is the difference between new Number() and Number()? I get that new Nu ...

  9. 电脑技巧 ADSL如何远程盗号

    ADSL如何远程盗号 开头语: 本文中揭露了黑客攻击ADSL用户,窃取用户名密码的常见方法,读者请勿将其用于不法用途,并提醒所有与此漏洞相关的用户尽快采取措施进行防范. ADSL作为一种宽带接入方式已 ...

  10. 【前端】怎样成长为一名优秀的前端project师---

    浅谈本人的经验.也算是与大家交流吧,本人眼下也是从事前端的工作,时间并不长,说的不好,请见谅. 首先,前端project师必须得掌握HTML.CSS和JavaScript. 仅仅懂当中一个或两个还不行 ...