Floyd && Dijkstra +邻接表 +链式前向星(真题讲解来源:城市路)
1381:城市路(Dijkstra)
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 4066 通过数: 1163
【题目描述】
罗老师被邀请参加一个舞会,是在城市n,而罗老师当前所处的城市为1,附近还有很多城市2~n-1,有些城市之间没有直接相连的路,有些城市之间有直接相连的路,这些路都是双向的,当然也可能有多条。
现在给出直接相邻城市的路长度,罗老师想知道从城市1到城市n,最短多少距离。
【输入】
输入n, m,表示n个城市和m条路;
接下来m行,每行a b c, 表示城市a与城市b有长度为c的路。
【输出】
输出1到n的最短路。如果1到达不了n,就输出-1。
【输入样例】
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
【输出样例】
90
【提示】
【数据规模和约定】
1≤n≤2000
1≤m≤10000
0≤c≤10000
【来源】
Floyd:(被省略了。。。。)
Dijkstra:
#include<bits/stdc++.h>
using namespace std;
int g[][];
int n,m;
int dis[];
bool used[];
int main(){
memset(g,0x3f,sizeof(g));
cin>>n>>m;
for(int i=;i<=m;++i){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a][b]=min(g[a][b],c);
g[b][a]=min(g[b][a],c);
}
memset(dis,0x3f,sizeof(dis));
dis[]=;
for(int i=;i<=n;++i){
int minn=0x3f3f3f3f,minn_j=;
for(int j=;j<=n;++j){
if(used[j]==false&&dis[j]<minn){
minn=dis[j];
minn_j=j;
}
}
if(minn_j==)
break;
used[minn_j]=true;
for(int j=;j<=n;j++)
if(used[j]==false)
dis[j]=min(dis[j],dis[minn_j]+g[minn_j][j]);
}
if(dis[n]==0x3f3f3f3f)
cout<<-;
else
cout<<dis[n];
}
+领接表:
#include<bits/stdc++.h>
using namespace std;
struct node{
int to,val;
};
vector<node> edge[]; int dis[];
bool used[];
int main(){
int n,m;
cin>>n>>m;
int a,b,c;
for(int i=;i<=m;i++){
cin>>a>>b>>c;
node t;
t.to=b;t.val=c;
edge[a].push_back(t);
t.to=a;t.val=c;
edge[b].push_back(t);
}
memset(dis,0x3f,sizeof(dis));
dis[]=;
for(int i=;i<=n;i++){
int minn=0x3f3f3f3f,minn_j=;
for(int j=;j<=n;j++){
if(used[j]==false&&dis[j]<minn){
minn=dis[j];
minn_j=j;
}
}
if(minn_j==)
break;
used[minn_j]=true;
int from=minn_j;
for(int j=;j<edge[from].size();j++){
int to=edge[from][j].to;
int val=edge[from][j].val;
dis[to]=min(dis[to],dis[from]+val);
} } if(dis[n]==0x3f3f3f3f)
cout<<-;
else
cout<<dis[n]; return ;
}
+链式前向星:
#include<bits/stdc++.h>
using namespace std;
struct node
{
int to,val,next;
};
node edge[]; int dis[];
bool used[];
int head[];
int num=;
void add_edge(int from,int to,int val)
{
num++;
edge[num].to=to;
edge[num].val=val;
edge[num].next=head[from];
head[from]=num;
} int main()
{
int n,m;
cin>>n>>m;
int a,b,c;
for(int i=;i<=m;i++)
{
cin>>a>>b>>c;
add_edge(a,b,c);
add_edge(b,a,c);
} memset(dis,0x3f,sizeof(dis));
memset(used,false,sizeof(used));
dis[]=;
for(int i=;i<=n;i++)
{
int minn=0x3f3f3f3f,minn_j=;
for(int j=;j<=n;j++)
{
if(used[j]==false && dis[j]<minn)
{
minn=dis[j];
minn_j=j;
}
}
if(minn_j==)
break;
used[minn_j]=true;
int from=minn_j;
for(int j=head[from];j!=;j=edge[j].next)
{
int to=edge[j].to;
int val=edge[j].val;
dis[to]=min(dis[to],dis[from]+val);
}
} if(dis[n]==0x3f3f3f3f)
cout<<-;
else
cout<<dis[n]; return ;
}
Floyd && Dijkstra +邻接表 +链式前向星(真题讲解来源:城市路)的更多相关文章
- 邻接表&链式前向星
链式前向星: 适合点多.边少的情况 不适用于大量遍历出边的题目(因为cache miss) 邻接表: 如果用邻接表来实现的话,一般就用vector嘛,我们都知道vector都是自动扩容的,在空间满了以 ...
- 洛谷P3371单源最短路径Dijkstra版(链式前向星处理)
首先讲解一下链式前向星是什么.简单的来说就是用一个数组(用结构体来表示多个量)来存一张图,每一条边的出结点的编号都指向这条边同一出结点的另一个编号(怎么这么的绕) 如下面的程序就是存链式前向星.(不用 ...
- 洛谷 P1352 没有上司的舞会【树形DP/邻接链表+链式前向星】
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
- 洛谷 P4779 【dijkstra】+(堆优化)+(链式前向星) (模板题)
<题目链接> 题目描述 给定一个 N 个点, M 条有向边的带非负权图,请你计算从 S 出发,到每个点的距离. 数据保证你能从 S 出发到任意点. 输入格式: 第一行为三个正整数 N,M, ...
- 洛谷 P4779 :【模板】单源最短路径(标准版)(Dijkstra+堆优化+链式前向星)
题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 100→60: Ag→Cu: 最终,他因此没能与理想 ...
- POJ - 1330 Nearest Common Ancestors 最近公共祖先+链式前向星 模板题
A rooted tree is a well-known data structure in computer science and engineering. An example is show ...
- 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...
- 图的存储结构:邻接矩阵(邻接表)&链式前向星
[概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...
- 三种邻接表存图模板:vector邻接表、数组邻接表、链式前向星
vector邻接表: ; struct Edge{ int u,v,w; Edge(int _u=0,int _v=0,int _w=0){u=_u,v=_v,w=_w;} }; vector< ...
随机推荐
- Mybaits 源码解析 (七)----- Select 语句的执行过程分析(下篇)(Mapper方法是如何调用到XML中的SQL的?)全网最详细,没有之一
我们上篇文章讲到了查询方法里面的doQuery方法,这里面就是调用JDBC的API了,其中的逻辑比较复杂,我们这边文章来讲,先看看我们上篇文章分析的地方 SimpleExecutor public & ...
- Linux中vi命令的详细总结
vi命令的使用 首先可以新建一个文件夹 touch 1.txt 之后通过vi命令进入其中 vi 1.txt 进入其中开始编辑,按下a键可以进行输入. 随便输入一些东西(暂时不支持中文) 非输入模式 ...
- Wininet-Post
#include "stdafx.h"#include <Windows.h>#include <wininet.h>#include <iostre ...
- 【XSY2564】sequence
Description [题目描述] 给定一个长度为n的由['0'..'9']组成的字符串s,v[i,j]表示由字符串s第i到第j位组成的十进制数字. 将它的某一个上升序列定义为:将这个字符串切割成m ...
- MVC5异步提交表单疑难杂症
//此处必须添加,不然不能执行异步回调OnAddPortSuccess方法 <script src="~/scripts/jquery.unobtrusive-ajax.min.js& ...
- [考试反思]1015csp-s模拟测试75:混乱
赶上一套极其傻逼的题(是傻逼,不是简单) T1超级卡精 T2模拟(输出卡"0.0"与"-0.0"不开spj),而且数据诡异乱打就能A(貌似给这道题的时间越长分越 ...
- python手册学习笔记3
笔记3 > http://www.pythondoc.com/pythontutorial3/datastructures.html 装饰器 def log(text): def decorat ...
- php debug_backtrace方法跟踪代码调用
php debug_backtrace方法跟踪代码调用<pre>function string 当前的函数名,参见: __FUNCTION__.line integer 当前的行号.参见: ...
- jquery写$ document.getElementById效果
jquery写$ document.getElementById效果<pre>document.getElementById('video-canvas')和$('#video-canva ...
- 痞子衡嵌入式:串行EEPROM接口事实标准及SPI EEPROM简介
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是EEPROM接口标准及SPI EEPROM. 痞子衡之前写过一篇文章 <SLC Parallel NOR简介>,介绍过并行N ...