图论: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.使 ...
随机推荐
- 说说C#中的enum吧
enum,就是枚举类型,它是struct,int,single,double一样,都属于值类型,从ValueType类型中派生,存储在栈中.它在被创建时,不需要分配内在空间,所以对程序的性能是有好处的 ...
- Oracle使用jdbc调用带游标参数的存储过程
package com.jckb.procedure; import java.sql.CallableStatement; import java.sql.Connection; import ja ...
- 扔掉360:Linux下无线网卡作WiFi路由器(转薄荷开源网)
这个话题很多人感兴趣,毕竟现在是无线互联时代.手机一族到外面去,首先关心的就是有没有 WiFi.Windows 7 用户可以安装 360 的软件,把笔记本电脑配置成路由器,供手机或其他电脑上网. 在 ...
- python_1基础学习
2017年12月02日 20:14:48 独行侠的守望 阅读数:221 标签: python 更多个人分类: Python编辑版权声明:本文为博主原创文章,转载请注明文章链接. https://blo ...
- npm安装使用淘宝代理的方法(设置registry参数)
公司防火墙问题导致 npm下载失败,安装使用cnpm不知道什么原因抽筋, 还有一个简单的办法,就是npm安装模块时,设置代理: npm install -g vue-cli --registry=ht ...
- 添加SAP_ALL权限
更新usr04,ust04,usrbf2这三张表 REPORT ZTESTCREATEUSER. data: l_USR04 LIKE USR04 , l_UST04 LIKE UST04 , l_P ...
- Hibernate笔记6-JPA-注解
一.JPA简介--Java Persistence API. 是SUN公司推出的一套基于ORM的规范.hibernate框架中提供了JPA的实现.JPA通过JDK5.0注解或XML描述对象-关系表的映 ...
- xp_delete_files不起作用解决方法
xp_delete_file用来删除数据库的备份文件和维护计划文本报告.示例: ,N'D:\Backup\Diff',N'bak',N'2019-05-29T10:03:41' 第一个参数表示文件类型 ...
- C语言——字符串长度的计算方法
1.不带转义字符的字符串 如:“abc!x=/”,其长度为7 2.带转义字符的字符串 (1) 字符串“abc\n”:其中的'\n'为转义字符(换行符),计算字符串长度时只能计作一个字符,所以该字符串的 ...
- 流媒体 6——MPEG电视
1.电视图像的数据率 1.1 ITU-R BT.601标准数据率 按照奈奎斯特(Nyquist)采样理论,模拟电视信号经过采样(把连续的时间信号变成离散的时间信号)和量化 (把连续的幅度变成离散的幅度 ...