最短路 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个,分别表示到了这个点时还有多少 ...
随机推荐
- jdbc连接获取表名称
1,Class.forName可以替换为mysql之类其他的数据库驱动 public Connection connect(String url,String username,String pw, ...
- Scrum Meeting 11.05
成员 今日任务 明日计划 用时 徐越 代码移植 学习ListView+simpleAdapter,actionBar.阅读并修改前端代码 4h 赵庶宏 服务器配置,代码移植 构建后端数据库,进行完善 ...
- 20162319 实验二 Java面对对象程序设计 实验报告
实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...
- 封装,策略,Asp换脸
封装.策略 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespac ...
- object-oriented first work
前言:在星期三的第一次面向对象程序设计课,遇见我们的栋哥,初次见面,发现老师的幽默.....下课后,就给我们一道作业题目... 作业要求:Create a program that asks for ...
- 关于map和hashmap
今天做的程序猿那题 在公司里面,程序猿经常有一堆todolist要做,而这些todolist是产品经理分配给他们的.但是当程序员遇到不懂技术的产品狗时,就悲剧了.产品经理经常修改他们的todolist ...
- 【动态规划】POJ-3616
一.题目 Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her pro ...
- Git命令提交项目代码
Git客户端安装 今天就结合`GitHub`,通过`Git`命令,来了解如何实现开源代码库以及版本控制 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托 ...
- php SPL标准库iterator和ArrayAccess的学习
最近在补充学习php基础的时候看到了spl的介绍,学习了一下iterator和arrayAccess的使用,iterator主要是对象的迭代,一般可以用在容器里面,或者工厂模式里面,最常见的应用场景就 ...
- 对一致性Hash算法及java实现(转)
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...