HDU-2544-最短路(各种最短路径算法)
- 迪杰斯特拉算法--O(n^2)
#include"iostream"
#include"cstring"
#include"cstdio"
using namespace std;
const int inf = 0x3f3f3f3f;
typedef long long LL;
int map[][];
int ans[], n, m;
bool flag[];
void dij() {
for(int i = ; i <= n; i++)
ans[i] = map[][i];
ans[] = ;
memset(flag, true, sizeof(flag));
flag[] = false;
for(int i = ; i < n; i++) {
int v, mn = inf;
for(int j = ; j <= n; j++)
// 此处建议用 <= 因为map和mx都是初始化为inf,如果用 < 可能一个都找不到导致v是随机值而产生RE。当然也可采用其他方式避免v的随机值;
if(ans[j] <= mn && flag[j]) {
mn = ans[j];
v = j;
}
for(int j = ; j <= n; j++)
if(ans[v] + map[v][j] < ans[j])
ans[j] = ans[v] + map[v][j];
flag[v] = false;
}
}
int main() {
int a, b, c;
while(scanf("%d%d", &n, &m) && (n || m)) {
memset(map, inf, sizeof(map));
while(m--) {
scanf("%d%d%d", &a, &b, &c);
if(map[a][b] > c)
map[a][b] = map[b][a] = c;
}
dij();
printf("%d\n", ans[n]);
}
return ;
} - 迪杰斯特拉算法堆优化--O(nlgn) 以链式前向星建图
#include "bits/stdc++.h"
using namespace std;
typedef pair<int, int> PII;
const int MAXN = ;
const int INF = 0x3f3f3f3f;
struct Edge {
int t, w, n;
} edge[MAXN << ];
int tot, tail[MAXN], dis[MAXN];
bool use[MAXN];
void add(int u, int v, int w) {
edge[tot].t = v;
edge[tot].w = w;
edge[tot].n = tail[u];
tail[u] = tot++;
}
void dij() {
memset(dis, INF, sizeof(dis));
memset(use, false, sizeof(use));
// PII的first表示权重,second表示节点。后面部分是为了让优先队列每次取最小值
priority_queue<PII, vector<PII>, greater<PII> > que;
for (int i = tail[]; i != -; i = edge[i].n) {
int t = edge[i].t;
int w = edge[i].w;
if (w < dis[t]) {
dis[t] = w;
que.push({w, t});
}
}
use[] = true;
while (!que.empty()) {
int v = que.top().second;
que.pop();
if (use[v]) continue;
use[v] = true;
for (int i = tail[v]; i != -; i = edge[i].n) {
int t = edge[i].t;
int w = edge[i].w;
if (dis[v] + w < dis[t]) {
dis[t] = dis[v] + w;
que.push({dis[t], t});
}
}
}
}
int main() {
int n, m, u, v, w;
while (scanf("%d%d", &n, &m) && (n || m)) {
tot = ;
memset(tail, -, sizeof(tail));
while (m--) {
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
dij();
printf("%d\n", dis[n]);
}
return ;
} - 迪杰斯特拉算法堆优化--O(nlgn) 以vector建图
#include "bits/stdc++.h"
using namespace std;
typedef pair<int, int> PII;
const int MAXN = ;
const int INF = 0x3f3f3f3f;
vector<PII> vc[MAXN];
int dis[MAXN];
bool use[MAXN];
void dij() {
memset(dis, INF, sizeof(dis));
memset(use, false, sizeof(use));
priority_queue<PII, vector<PII>, greater<PII> > que;
for (int i = ; i < vc[].size(); i++) {
PII p = vc[][i];
if (p.second < dis[p.first]) {
dis[p.first] = p.second;
que.push({dis[p.first], p.first});
}
}
use[] = true;
while (!que.empty()) {
int v = que.top().second;
que.pop();
if (use[v]) continue;
use[v] = true;
for (int i = ; i < vc[v].size(); i++) {
PII p = vc[v][i];
if (dis[v] + p.second < dis[p.first]) {
dis[p.first] = dis[v] + p.second;
que.push({dis[p.first], p.first});
}
}
}
}
int main() {
int n, m, u, v, w;
while (scanf("%d%d", &n, &m) && (n || m)) {
for (int i = ; i <= n; i++) vc[i].clear();
while (m--) {
scanf("%d%d%d", &u, &v, &w);
vc[u].push_back({v, w});
vc[v].push_back({u, w});
}
dij();
printf("%d\n", dis[n]);
}
return ;
} - 弗洛伊德算法--O(n^3)
#include"iostream"
#include"cstring"
#include"cstdio"
using namespace std;
const int inf = 0x3f3f3f3f;
typedef long long LL;
int map[][];
int n, m;
void Floyd() {
for(int k = ; k <= n; k++)
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
if(map[i][k] + map[k][j] < map[i][j])
map[i][j] = map[i][k] + map[k][j];
}
int main() {
int a, b, c;
while(scanf("%d%d", &n, &m) && (n || m)) {
memset(map, inf, sizeof(map));
while(m--) {
scanf("%d%d%d", &a, &b, &c);
if(map[a][b] > c)
map[a][b] = map[b][a] = c;
}
Floyd();
printf("%d\n", map[][n]);
}
return ;
} - SPFA算法--O(KE)--E是边数,K一般为2-3
#include"iostream"
#include"cstring"
#include"cstdio"
#include"queue"
using namespace std;
const int inf = 0x3f3f3f3f;
typedef long long LL;
int map[][];
int ans[], n, m;
bool flag[];
void SPFA() {
memset(ans, inf, sizeof(ans));
memset(flag, true, sizeof(flag));
ans[] = ;
queue<int>q;
q.push(); flag[] = false;
while(!q.empty()) {
int v = q.front();
flag[v] = true;
q.pop();
for(int i = ; i <= n; i++)
if(ans[v] + map[v][i] < ans[i]) {
ans[i] = ans[v] + map[v][i];
if(flag[i]) {
q.push(i);
flag[i] = false;
}
}
}
}
int main() {
int a, b, c;
while(scanf("%d%d", &n, &m) && (n || m)) {
memset(map, inf, sizeof(map));
while(m--) {
scanf("%d%d%d", &a, &b, &c);
if(map[a][b] > c)
map[a][b] = map[b][a] = c;
}
SPFA();
printf("%d\n", ans[n]);
}
return ;
} - 深度优先搜索算法
#include"iostream"
#include"cstring"
#include"cstdio"
#include"queue"
using namespace std;
const int inf = 0x3f3f3f3f;
typedef long long LL;
int map[][];
int ans, n, m;
bool flag[];
void DFS(int i, int k) {
if(i == n) {
if(k < ans)
ans = k;
return;
}
for(int j = ; j <= n; j++)
if(flag[j] && k + map[i][j] < ans) {
flag[j] = false;
DFS(j, k + map[i][j]);
flag[j] = true;
}
}
int main() {
int a, b, c;
while(scanf("%d%d", &n, &m) && (n || m)) {
memset(map, inf, sizeof(map));
while(m--) {
scanf("%d%d%d", &a, &b, &c);
if(map[a][b] > c)
map[a][b] = map[b][a] = c;
}
memset(flag, true, sizeof(flag));
flag[] = false;
ans = inf; DFS(, );
printf("%d\n", ans);
}
return ;
}
HDU-2544-最短路(各种最短路径算法)的更多相关文章
- HDU - 2544最短路 (dijkstra算法)
HDU - 2544最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以 ...
- hdu 2544 最短路(SPFA算法)
本题链接:点击打开链接 本题大意: 首先输入一个n,m.代表有n个点.m条边.然后输入m条边,每条边输入两个点及边权.1为起点,n为终点.输入两个零表示结束. 解题思路: 本题能够使用SPFA算法来做 ...
- ACM: HDU 2544 最短路-Dijkstra算法
HDU 2544最短路 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descrip ...
- UESTC 30 &&HDU 2544最短路【Floyd求解裸题】
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 2544 最短路(两点间最短路径)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2544 方法一:dijkstra算法,求两点之间最短路径. /*********************** ...
- HDU 2544最短路 (迪杰斯特拉算法)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others) Me ...
- hdu 2544 最短路
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shi ...
- 题解报告:hdu 2544 最短路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t ...
- (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。
floyd解法 今天初看dijkstra,先拿这两题练手,其他变形题还是不是很懂. 模版题,纯练打字... HDU 1874: #include <cstdio> #define MAXN ...
- hdu 2544 最短路 (最短路径)
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
随机推荐
- sonarqube linux安装总结,集成jenkins
第一条建议,安装sonarqube首先看好版本号,不同版本号的安装配置可能不同,如果你想走捷径,看官网对应发布的安装使用教程.https://www.sonarqube.org/downloads/ ...
- PAT B1038 统计同成绩学生超时问题
输入格式: 输入在第 1 行给出不超过 105 的正整数 N,即学生总人数.随后一行给出 N 名学生的百分制整数成绩,中间以空格分隔.最后一行给出要查询的分数个数 K(不超过 N 的正整数),随 ...
- BZOJ 4913 [Sdoi2017] 遗忘的集合
骂了隔壁的 BZOJ垃圾评测机 我他妈卡了两页的常数了 我们机房的电脑跑的都比BZOJ快
- html5中如何去掉input type date默认样式
html5中如何去掉input type date默认样式 1.时间选择的种类: HTML代码: 选择日期:<input type="date" value="20 ...
- 关于maven的使用总结
maven介绍 项目构建过程 eclipse只是开发工具,虽然提供了创建.编码.编译.测试.运行等功能,但并不是项目构建工具. 项目构建主要过程如下: 实际的项目构建过程要复杂繁琐的多.如果是一个独立 ...
- 箭头函数,闭包函数中的this指向
在javscript中,this 是在函数运行时自动生成的一个内部指针,它指向函数的调用者. 箭头函数有些不同,它的this是继承而来, 默认指向在定义它时所处的对象(宿主对象),而不是执行时的对象. ...
- Mongodb数据库(linux)——基础操作
简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.它是非关系型数据库,但其结构与MySQL又很相似,mysql中的表格,在这里被称为集合,mysql表格内的数据是一 ...
- upstream(负载均衡)
一.什么是负载均衡 负载均衡,顾名思义是指将负载尽量均衡的分摊到多个不同的服务器,以保证服务的可用性和可靠性,提供给客户更好的用户体验: 负载均衡的直接目标就是尽量发挥多个服务单元的整体效能,要实现这 ...
- Hard Disk Drive(MBR)
这里讲的主要是网上所谓的老式磁盘,它是由一个个盘片组成的,我们先从个盘片结构讲起.如图1所示,图中的一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之 ...
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)报错
0 环境 系统环境:win10 1 正文 先检查Mapper接口与相关联xml文件是否对应,需要检查包名,namespace位置是否写对,curd时id名称等能否对应上 常规步骤: :检查mapper ...