HDU 2544 最短路(floyd+bellman-ford+spfa+dijkstra队列优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544
题目大意:找点1到点n的最短路(无向图)
练一下最短路。。。
dijkstra+队列优化:
#include<iostream>
#include<functional>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int, int> p;//first是最短距离,second是顶点编号
const int N = ;
const int INF = << ; struct edge {
int to, cost;//邻接的点,以及到该点的权值
}; vector<edge>eg[N];//邻接表
bool used[N];//表示是否已被使用过
int d[N];//最短距离
int V, E;//顶点数和边数 void dijistra(int s) {
//优先队列,按first从小到大顺序
priority_queue<p, vector<p>, greater<p> >q;
//初始化
for (int i = ; i <= V; i++) {
d[i] = INF;
used[i] = false;
}
d[s] = ; q.push(p(, s));
while (!q.empty()) {
p p1 = q.top();
q.pop();
int v = p1.second;
if (used[v]) continue;
used[v] = true;
for (int i = ; i<eg[v].size(); i++) {
edge e = eg[v][i];
if (d[e.to]>d[v] + e.cost) {
d[e.to] = d[v] + e.cost;
q.push(p(d[e.to], e.to));
}
}
}
} int main() {
while (cin >> V >> E && (V || E)) {
for(int i=;i<=V;i++){
eg[i].clear();
}
for (int i = ; i <= E; i++) {
int a, b, cost;
cin >> a >> b >> cost;
edge g1, g2;
g1.to = b, g2.to = a;
g1.cost = g2.cost = cost;
eg[a].push_back(g1);
eg[b].push_back(g2);
}
dijistra();
cout << d[V] << endl;
}
}
bellman-ford:
/*
bellman-ford
*/
#include<iostream>
#include<cstring>
using namespace std;
const int N=;
const int INF=<<; struct edge{
int from,to,cost;
}es[N];//边 int d[N];//出发点到i的最短距离
int V,E;//顶点数、边数 //求解从顶点s出发到所有点的最短距离
void shortest_path(int s){
for(int i=;i<=V;i++) d[i]=INF;
d[s]=;
while(true){
bool update=false;
for(int i=;i<=E;i++){
edge e=es[i];
if(d[e.from]!=INF&&d[e.to]>d[e.from]+e.cost){
d[e.to]=d[e.from]+e.cost;
update=true;
}
//双向
if(d[e.to]!=INF&&d[e.from]>d[e.to]+e.cost){
d[e.from]=d[e.to]+e.cost;
update=true;
} }
if(!update) break;
}
} int main(){
int n,m;
while(cin>>V>>E&&(V||E)){
for(int i=;i<=E;i++){
cin>>es[i].from>>es[i].to>>es[i].cost;
}
shortest_path();
cout<<d[V]<<endl;
}
}
floyd:
/*floyd*/
#include<iostream>
#include<algorithm>
using namespace std;
const int N=;
const int INF=<<;
int map[N][N];//map[i][j]表示边i~j的距离 int V,E;//顶点数,边数 void floyd(){
for(int k=;k<=V;k++)
for(int i=;i<=V;i++)
for(int j=;j<=V;j++)
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
} int main(){
while(cin>>V>>E&&(V||E)){
for(int i=;i<=V;i++){
for(int j=;j<=V;j++){
if(i==j)
map[i][j]=;
else
map[i][j]=INF;
}
}
for(int i=;i<=E;i++){
int a,b,cost;
cin>>a>>b>>cost;
map[a][b]=map[b][a]=cost;
}
floyd();
cout<<map[][V]<<endl;
}
}
spfa:
/*spfa*/
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
const int N=;
const int INF=<<; int map[N][N];
int d[N];//距离起点最小距离
bool used[N];//点是否在队列中
int V,E;//顶点数,边数 //求解从顶点s出发到所有点的最短距离
void spfa(int s){
//初始化
for(int i=;i<=V;i++){
d[i]=INF;
used[i]=false;
}
d[s]=; queue<int>q;
q.push(s);
used[s]=true;
while(!q.empty()){
int k=q.front();
q.pop();
used[k]=false;
//此处实际上可以不用遍历所有点,能够用邻接表优化
for(int i=;i<=V;i++){
if(d[i]>d[k]+map[k][i]){
d[i]=d[k]+map[k][i];
//这个点更新后要入队,要判断是否已经在队列中
if(!used[i]){
q.push(i);
used[i]=true;
}
}
}
}
} int main(){
while(cin>>V>>E&&(V||E)){
//初始化
for(int i=;i<=V;i++)
for(int j=;j<=V;j++)
map[i][j]=(i==j?:INF); for(int i=;i<=E;i++){
int a,b,cost;
cin>>a>>b>>cost;
map[a][b]=map[b][a]=cost;
}
spfa();
cout<<d[V]<<endl;
}
}
HDU 2544 最短路(floyd+bellman-ford+spfa+dijkstra队列优化)的更多相关文章
- HDU 2544 最短路 (Floyd)
题意:略. 析:由于 n 比较小,所以我们可以用Floyd,完全不会超时. 代码如下: #pragma comment(linker, "/STACK:1024000000,10240000 ...
- UESTC 30 &&HDU 2544最短路【Floyd求解裸题】
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- ACM: HDU 2544 最短路-Dijkstra算法
HDU 2544最短路 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descrip ...
- HDU - 2544最短路 (dijkstra算法)
HDU - 2544最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以 ...
- 蓝桥杯 algo_5 最短路 (bellman,SPFA)
问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个 ...
- hdu 2544 最短路
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shi ...
- hdu 2544最短路——最短路的初次总结 UESTC 6th Programming Contest Online
这是一道标准的模板题,所以拿来作为这一段时间学习最短路的总结题目. 题意很简单: 有多组输入数据,每组的第一行为两个整数n, m.表示共有n个节点,m条边. 接下来有m行,每行三个整数a, b, c. ...
- (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。
floyd解法 今天初看dijkstra,先拿这两题练手,其他变形题还是不是很懂. 模版题,纯练打字... HDU 1874: #include <cstdio> #define MAXN ...
- HDU 2544最短路 (迪杰斯特拉算法)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others) Me ...
随机推荐
- 【BZOJ3437】小P的牧场(动态规划,斜率优化)
[BZOJ3437]小P的牧场(动态规划,斜率优化) 题面 BZOJ 题解 考虑暴力\(dp\),设\(f[i]\)表示强制在\(i\)处建立控制站的并控制\([1..i]\)的最小代价. 很显然,枚 ...
- [ZJOI2015]幻想乡战略游戏——动态点分治
[ZJOI2015]幻想乡战略游戏 带修改下,边点都带权的重心 随着变动的过程中,一些子树内的点经过会经过一些公共边.考虑能不能对这样的子树一起统计. 把树上贡献分块. 考虑点分治算法 不妨先把题目简 ...
- [转载]js正则表达式语法
1. 正则表达式规则 1.1 普通字符 字母.数字.汉字.下划线.以及后边章节中没有特殊定义的标点符号,都是"普通字符".表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的 ...
- Myeclipse下更改所有jsp、html文件的编码
windows-->>preferences-->>gengral-->>
- P1582 倒水 (数学)
P1582 倒水 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把 ...
- python学习笔记(五) 200行实现2048小游戏
用前文提到的基础知识,和网上流行的2048源码,用python实现该游戏. 先将用户操作和游戏逻辑绑定. WASD分别对应移动方向上.左.下.右 然后实现矩阵的转置和逆置,这样只要实现一个方向的移动, ...
- UVA-10375 数学
UVA-10375 题意 : 输入p,q,r,s,求C(p,q)/C(r,s). p,q,r,s<=10000:结果不超过1e8 代码: //显然不能直接计算,考虑每个数都可以由若干个素数乘积得 ...
- 【转】解决virt-manager启动管理器出错:unsupported format character
来源:http://blog.csdn.net/z_yttt/article/details/71192144 经验证OK. 今天打开virt-manager出错,报错信息如下: 启动管理器出错: ...
- [Java多线程]-Thread和Runable源码解析
多线程:(百度百科借一波定义) 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提 ...
- OpenCV---图像梯度
图像梯度 推文:[OpenCV入门教程之十二]OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑 图像梯度可以把图像看成二维离散函数,图像梯度其实就是这个 ...