最短路 dijkstra 优先队列
1.裸题 hdu2544
http://acm.hdu.edu.cn/showproblem.php?pid=2544
Way1:
好像不对
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <stdbool.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn 100+5
#define inf 1e9 long dist[maxn],road[maxn][maxn];
bool vis[maxn];
struct cmp
{
bool operator() (long a,long b)
{
return dist[a]>dist[b];
}
};
priority_queue<long,vector<long>,cmp> f; int main()
{
long n,m,i,j,x,y,z,d;
while ()
{
scanf("%ld%ld",&n,&m);
if (n== && m==)
break;
for (i=;i<=n;i++)
for (j=;j<=n;j++)
road[i][j]=inf;
for (i=;i<=m;i++)
{
scanf("%ld%ld%ld",&x,&y,&z);
road[x][y]=min(road[x][y],z);
road[y][x]=road[x][y];
}
for (i=;i<=n;i++)
{
vis[i]=false;
dist[i]=inf;
}
dist[]=;
//pay attention!
while (!f.empty())
f.pop();
f.push();
for (j=;j<n;j++) //use 'i' wrong!
{
while (vis[f.top()])
f.pop();
d=f.top();
if (d==n)
break;
vis[d]=true;
f.pop(); for (i=;i<=n;i++)
if (!vis[i] && dist[i]>dist[d]+road[i][d])
{
dist[i]=dist[d]+road[i][d];;
f.push(i);
}
}
printf("%ld\n",dist[n]);
}
return ;
}
/*
6 7
1 2 10
1 2 3
1 3 1
2 4 3
4 5 1
5 6 10
2 5 1
*/
Way2:
自行写堆,让堆中的值减小(路径长度减小),在堆中上升。
只要掌握了合理的写法,其实也不是特别不好理解和难写
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <stdbool.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn 10000+5
#define inf 1e9 //pos[i]:编号为i的城市到起点的距离 在 树中的位置
long dist[maxn],road[maxn][maxn],tree[maxn],pos[maxn],g=;
bool vis[maxn]; //minimum-heap
void up(long i)
{
long j,temp;
while (i>)
{
j=i>>;
//i>j
if (dist[tree[i]]<dist[tree[j]])
{
temp=tree[i];
tree[i]=tree[j];
tree[j]=temp;
pos[tree[i]]=i;
pos[tree[j]]=j;
}
else
break;
i=j;
}
} void down(long i)
{
long j,temp;
while ((i<<)<=g)
{
j=i<<;
if (dist[tree[j+]]<dist[tree[j]])
j++;
//i<j
if (dist[tree[i]]>dist[tree[j]])
{
temp=tree[i];
tree[i]=tree[j];
tree[j]=temp;
pos[tree[i]]=i;
pos[tree[j]]=j;
}
else
break;
i=j;
}
} int main()
{
long n,m,i,j,x,y,z,d;
while ()
{
scanf("%ld%ld",&n,&m);
if (n== && m==)
break;
for (i=;i<=n;i++)
for (j=;j<=n;j++)
road[i][j]=inf;
for (i=;i<=m;i++)
{
scanf("%ld%ld%ld",&x,&y,&z);
road[x][y]=min(road[x][y],z);
road[y][x]=road[x][y];
}
for (i=;i<=n;i++)
{
vis[i]=false;
dist[i]=-;
}
dist[]=;
g=;
tree[]=;
pos[]=;
for (j=;j<n;j++) //use 'i' wrong!
{
d=tree[];
if (d==n)
break;
tree[]=tree[g];
pos[tree[]]=;
g--;
down(); vis[d]=true;
for (i=;i<=n;i++)
if (!vis[i])
{
if (dist[i]==-)
{
dist[i]=dist[d]+road[i][d];
g++;
tree[g]=i;
pos[i]=g;
up(g);
}
else if (dist[i]>dist[d]+road[i][d])
{
dist[i]=dist[d]+road[i][d];
up(pos[i]);
}
}
}
printf("%ld\n",dist[n]);
}
return ;
}
/*
6 7
1 2 10
1 2 3
1 3 1
2 4 3
4 5 1
5 6 10
2 5 1
*/
2.多关键字
L3-011. 直捣黄龙
https://www.patest.cn/contests/gplt/L3-011
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <stdbool.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn 200+5
#define inf 1e9 struct node
{
long kill,dist,free,count;
}point[maxn]; struct cmp
{
bool operator() (long a,long b)
{
return point[a].dist>point[b].dist;
}
};
priority_queue<long,vector<long>,cmp> f; long road[maxn][maxn],kill[maxn],pre[maxn],n;
char s[maxn][];
bool vis[maxn]; long find(char ss[])
{
long i;
for (i=;i<=n;i++)
if (strcmp(s[i],ss)==)
return i;
} void print(long d)
{
if (pre[d]!=-)
{
print(pre[d]);
printf("->%s",s[d]);
}
else
printf("%s",s[d]);
} int main()
{
char s1[],s2[];
long m,i,j,d,x,y,e;
scanf("%ld%ld%s%s",&n,&m,s1,s2);
for (i=;i<=n;i++)
{
point[i].dist=inf;
vis[i]=false;
}
for (i=;i<=n;i++)
for (j=;j<=n;j++)
road[i][j]=inf+;
point[n].kill=;
strcpy(s[n],s1);
pre[n]=-;
point[n].dist=;
point[n].free=;
point[n].count=;
f.push(n);
for (i=;i<n;i++)
{
scanf("%s%ld",s[i],&kill[i]);
if (strcmp(s2,s[i])==)
e=i;
}
for (i=;i<=m;i++)
{
scanf("%s%s%ld",s1,s2,&d);
x=find(s1);
y=find(s2);
road[x][y]=min(road[x][y],d);
road[y][x]=road[x][y];
}
for (j=;j<n;j++)
{
while (vis[f.top()])
f.pop();
d=f.top();
if (d==e)
break;
vis[d]=true;
for (i=;i<=n;i++)
if (!vis[i])
{
if (point[i].dist>point[d].dist+road[i][d])
{
pre[i]=d;
point[i].count=point[d].count;
point[i].dist=point[d].dist+road[i][d];
point[i].free=point[d].free+;
point[i].kill=point[d].kill+kill[i];
f.push(i);
}
else if (point[i].dist==point[d].dist+road[i][d])
{
point[i].count+=point[d].count;
if ((point[i].free<point[d].free+) ||
(point[i].free==point[d].free+ && point[i].kill<point[d].kill+kill[i]))
{
pre[i]=d;
point[i].free=point[d].free+;
point[i].kill=point[d].kill+kill[i];
f.push(i);
}
}
}
}
print(e);
printf("\n%ld %ld %ld\n",point[e].count,point[e].dist,point[e].kill);
return ;
}
最短路 dijkstra 优先队列的更多相关文章
- Codeforces Gym101502 I.Move Between Numbers-最短路(Dijkstra优先队列版和数组版)
I. Move Between Numbers time limit per test 2.0 s memory limit per test 256 MB input standard inpu ...
- HDU 1874-畅通project续(最短路Dijkstra+优先队列)
畅通project续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 最短路--dijkstra+优先队列优化模板
不写普通模板了,还是需要优先队列优化的昂 #include<stdio.h> //基本需要的头文件 #include<string.h> #include<queue&g ...
- POJ - 2387 Til the Cows Come Home (最短路Dijkstra+优先队列)
Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before ...
- 最短路 dijkstra+优先队列+邻接表
http://acm.hdu.edu.cn/showproblem.php?pid=2544 #include<iostream> #include<queue> #inclu ...
- 【poj 1724】 ROADS 最短路(dijkstra+优先队列)
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12436 Accepted: 4591 Description N ...
- 地铁 Dijkstra(优先队列优化) 湖南省第12届省赛
传送门:地铁 思路:拆点,最短路:拆点比较复杂,所以对边进行最短路,spfa会tle,所以改用Dijkstra(优先队列优化) 模板 /******************************** ...
- 单源最短路dijkstra算法&&优化史
一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+ML ...
- 【bzo1579】拆点+dijkstra优先队列优化+其他优化
题意: n个点,m条边,问从1走到n的最短路,其中有K次机会可以让一条路的权值变成0.1≤N≤10000;1≤M≤500000;1≤K≤20 题解: 拆点,一个点拆成K个,分别表示到了这个点时还有多少 ...
随机推荐
- MCS锁——可伸缩的自旋锁
在编写并发同步程序的时候,如果临界区非常小,比如说只有几条或几十条指令,那么我们可以选择自旋锁(spinlock).使用普通的互斥锁会涉及到操作系统的调度,因此小临界区一般首选自旋锁.自旋锁的工作方式 ...
- (转)一个简单的rest_framework demo
转发:https://www.cnblogs.com/fu-yong/p/9100559.html models.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from ...
- 第35次Scrum会议(11/23)【欢迎来怼】
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文小组照片 二.开会信息 时间:2017/11/23 17:03~17:24,总计21min.地点:东北师 ...
- js中模拟a标签的点击事件
var a = document.createElement('a'); a.target = "_blank"; a.href = "personal"; a ...
- 20172324 2017-2018-2《程序设计与数据结构》第五周 n!的计算
20172324 2017-2018-2<程序设计与数据结构>实验2报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 曾程 学号:20172324 实验教师:王志强 ...
- web12 使用map型的request、session、application
电影网站:www.aikan66.com 项目网站:www.aikan66.com 游戏网站:www.aikan66.com 图片网站:www.aikan66.com 书籍网站:www.aikan66 ...
- 【DL.AI】《Structuring Machine Learning Projects》笔记
一.改进模型的几个方法 Collect more data Collect more diverse training set Train algorithm longer with gradient ...
- STL的集合set
集合: 集合是由元素组成的一个类,其成员可以是一个集合,也可以是一个原子,通常一个元素在一个集合中不能多次出现:由于对实现集合不是很理解,只简单写下已有的STL中的set集合使用: C++中set基本 ...
- Scrum 5.0
5.0--------------------------------------------------- 1.团队成员完成自己认领的任务. 2.燃尽图:理解.设计并画出本次Sprint的燃尽图的理 ...
- 用delphi开发activex打印控件
http://blog.csdn.net/baronyang/article/details/4465468