图论:HDU2544-最短路(最全、最经典的最短路入门及小结)
最短路
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 45288 Accepted Submission(s): 19993
输入保证至少存在1条商店到赛场的路线。
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
2

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100+10;
const int Max = 99999999;
int d[1000010];
int maps[maxn][maxn];
int n,m;
bool use[maxn];//用于标记,避免循环走 void Ds()
{
while(1)
{
int v = -1;//记录最近的点
for(int i=1;i<=n;i++)
if((v == -1 || d[i]<d[v]) && !use[i])
v = i;
if(v == -1)
break;
use[v] = 1;
for(int i=1;i<=n;i++)
d[i] = min(d[i],d[v]+maps[i][v]);//d[v] + maps[i][v],记录从起点到i的距离
}
}
int main()
{
//printf("%d",Max);
while(scanf("%d%d",&n,&m) && n+m)
{
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
maps[i][j] = Max;//初始化为最大
memset(use,0,sizeof(use));
for(int i=0;i<=m*n+10;i++)
d[i] = Max;//初始化为最大
for(int i=0;i<m;i++)
{
int start,end;
int len;
d[1] = 0;//自身走到自身是0
scanf("%d%d%d",&start,&end,&len);
maps[start][end] = maps[end][start] = len;//是双向的并没有固定方向
}
Ds();
printf("%d\n",d[n]);
}
}
/*
这个主要优化的是空间存放问题和时间优化,这个算是真正实用的dij
关于空间优化是直接使用vect 动态数组,毕竟每次都开静态的二维数组不现实
然后就是使用优先队列,使用优先队列在松弛的时候可以直接找到最短的额那个
边这样就节省了找最短边的过程。
*/ #include<bits/stdc++.h>
using namespace std;
#define maxn 1005
#define INF 0x3f3f3f
struct node
{
int now,len;
bool operator <(const node &a) const
{
return a.len<len;
}
};
int n,m,dis[maxn],use[maxn];
vector<node> mp[maxn];//使用动态数组存放,可以避免很大的空间浪费
void dij(int st)
{
priority_queue<node> qu;
node tmp;
tmp.now=st;
tmp.len=0;
qu.push(tmp); dis[st]=0;
while(qu.size())
{
tmp=qu.top();
qu.pop();
if(use[tmp.now]==1)
continue;
use[tmp.now]=1; int l=mp[tmp.now].size();
for(int i=0;i<l;i++)
{
if(dis[mp[tmp.now][i].now]>dis[tmp.now]+mp[tmp.now][i].len)
{
dis[mp[tmp.now][i].now]=dis[tmp.now]+mp[tmp.now][i].len;
node next;
next.now=mp[tmp.now][i].now;
next.len=dis[next.now];
qu.push(next);
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m),n|m)
{
for(int i=1;i<=n;i++)
{
dis[i]=INF;
mp[i].clear();
}
memset(use,0,sizeof(use)); node tmp;
for(int i=1;i<=m;i++)
{
int x,y,len;
scanf("%d%d%d",&x,&y,&len);
tmp.now=y,tmp.len=len;
mp[x].push_back(tmp);
tmp.now=x;
mp[y].push_back(tmp);
}
dij(1);
printf("%d\n",dis[n]);
}
return 0;
}
/*
floyd算法可以算出任意两个点之间的最小距离,但是要注意的是floyd
的时间复杂度是n^3数据量比较大的时候很容易超时,一般不会直接使用
floydfloyd只是用来处理一些数据
*/ #include<bits/stdc++.h>
using namespace std;
int n,m;
const int maxn = 110;
const int INF = 0x3f3f3f3f;
int maps[maxn][maxn]; void pre_maps()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
maps[i][j] = INF;
while(m--)
{
int a,b,len;
scanf("%d%d%d",&a,&b,&len);
if(len < maps[a][b])
maps[a][b] = maps[b][a] = len;
}
} void Floyd()
{
for(int k=1;k<=n;k++)//这里要注意一下,作为中间的那个点必须要放在最外层
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(maps[i][j] > maps[i][k] + maps[k][j])
maps[i][j] = maps[i][k] + maps[k][j];
} int main()
{
while(scanf("%d%d",&n,&m) && (n+m))
{
pre_maps();
Floyd();
printf("%d\n",maps[1][n]);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
#define INF 0x3f3f3f
struct node
{
int to,len;
};
int n,m,use[maxn],dis[maxn];//这里use是记录这个点是否在队列中,如果在队列中就不再压入了除了队列要将标记消除
vector<node> mp[maxn];
void spfa(int st)
{
dis[st]=0;
use[st]=1;
queue<int> qu;
qu.push(st);
int now,next;
while(qu.size())
{
now=qu.front();
qu.pop();
use[now]=0;
int l=mp[now].size();
for(int i=0;i<l;i++)
{
next=mp[now][i].to;
int len=dis[now]+mp[now][i].len; if(dis[next]>len)
{
dis[next]=len;
if(use[next]==0)
{
qu.push(next);
use[next]=1;
}
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m),n|m)
{
for(int i=1;i<=n;i++)
{
dis[i]=INF;
mp[i].clear();
}
memset(use,0,sizeof(use));
node now;
for(int i=1;i<=m;i++)
{
int x,y,len;
scanf("%d%d%d",&x,&y,&len); now.to=y,now.len=len;
mp[x].push_back(now);
now.to=x;
mp[y].push_back(now);
}
spfa(1);
printf("%d\n",dis[n]);
}
return 0;
}
图论:HDU2544-最短路(最全、最经典的最短路入门及小结)的更多相关文章
- 模板C++ 03图论算法 2最短路之全源最短路(Floyd)
3.2最短路之全源最短路(Floyd) 这个算法用于求所有点对的最短距离.比调用n次SPFA的优点在于代码简单,时间复杂度为O(n^3).[无法计算含有负环的图] 依次扫描每一点(k),并以该点作为中 ...
- 超全PHP学习资源整理:入门到进阶系列
PHP是少数几门在语言层面饱受诟病,但在实际开发和应用上却又让人无法撒手的语言之一.就好比路边摊小吃,一遍骂人家不卫生,一遍却又说:真香.所谓接地气,不外如此,大道理不说,PHP光是轮子多.市场占有率 ...
- [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
- 【最全】经典排序算法(C语言)
算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首 ...
- [图论训练]BZOJ 2118: 墨墨的等式 【最短路】
Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在 ...
- [No000016F]高并发下线程安全的单例模式(最全最经典)
在所有的设计模式中,单例模式是我们在项目开发中最为常见的设计模式之一,而单例模式有很多种实现方式,你是否都了解呢?高并发下如何保证单例模式的线程安全性呢?如何保证序列化后的单例对象在反序列化后任然是单 ...
- Linux进程间通信(五) - 信号灯(史上最全)及其经典应用案例
信号灯概述 什么是信号灯 信号灯用来实现同步,用于多线程,多进程之间同步共享资源(临界资源). PV原语:信号灯使用PV原语 P原语操作的动作是: u sem减1. u sem减1后仍大于或等于零 ...
- [No00004F]史上最全Vim快捷键键位图(入门到进阶)
史上最全Vim快捷键键位重磅来袭!!学习Linux的朋友看过来啦,你是不是觉得Linux编辑器Vim操作复杂,步骤繁琐呢?Linux工程师是不是想大幅度提升自己的工作效率呢? 经典版 下 ...
- [No00004F]史上最全Vim快捷键键位图(入门到进阶)vim常用命令总结
在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行.你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format.使 ...
随机推荐
- spring运用的设计模式
1.代理模式(典型的aop) 2.工厂模式(beanFactory) 3.观察者模式(ApplicationContextEvent && ApplicationContextList ...
- 人工智能之必须会的Python基础
Python 号称是最接近人工智能的语言,因为它的动态便捷性和灵活的三方扩展,成就了它在人工智能领域的丰碑 走进Python,靠近人工智能 一.编程语言Python的基础 之 "浅入浅出&q ...
- 提高jquery加载速率(有cdn就加载,没有就加载本地)
<!-- Adds google cdn reference --> <script src="https://cdn.bootcss.com/jquery/3.2.1/j ...
- form表单上传域(type="file")的使用----上传文件
一,单个文件的上传 1.html/jsp页面 <%@ page language="java" contentType="text/html; charset=UT ...
- 9.26<立方网>技术笔试题
该公司题目感觉不难,算法设计有三道大题. 1.设有m和n两个整数,求它们的最大公约数和最小公倍数. 2.猴子分桃问题,每次分桃多一个,共有五个猴子,问最少有多少个桃子. 3.关于java的题目,有A, ...
- 创见VR-上海,会后总结
第一次,参加这种VR会,感觉不错.上午突然发现自己之前的一款AR Demo下载量在10-50了,真没想到,虽然这款Demo有一处bug至今未修复 ^^.不过,看来现在AR/VR确实恨火. ZSpace ...
- react爬坑之路(一)--报错output.path不是绝对路径
之前,一直在纠结是学习angular好,学习vue好,还是学习react好,网上一搜索,也是各种对比,各种互喷,看过之后更纠结.就跟小时候一样纠结长大了是上清华好,还是上北大好,最后证明我想多了.总之 ...
- COGS 11. 运输问题1
★★☆ 输入文件:maxflowa.in 输出文件:maxflowa.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 一个工厂每天生产若干商品,需运输到 ...
- java Vamei快速教程11 对象引用
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们之前一直在使用“对象”这个概念,但没有探讨对象在内存中的具体存储方式.这方面的 ...
- 《Ruby on Rails教程》学习笔记
本文是我在阅读 Ruby on Rails 教程的简体中文版时所做的摘录,以及学习时寻找的补充知识.补充知识主要来自于 Ruby on Rails 實戰聖經. Asset Pipeline 在最新版 ...