hdu 1874(最短路 Dilkstra +优先队列优化+spfa)
畅通工程续
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 50537 Accepted Submission(s): 18852
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<cstdlib>
#include<string>
#define eps 0.000000001
typedef long long ll;
typedef unsigned long long LL;
using namespace std;
const int N=+;
const int INF=0x3f3f3f3f;
int n,m;
int mp[N][N];
int vis[N];
int dis[N];
void init(){
// memset(dis,0,sizeof(dis));
memset(vis,,sizeof(vis));
for(int i=;i<N;i++)
for(int j=;j<N;j++){mp[i][j]=INF;
} }
void Dijkstra(int v,int e){
dis[v]=;
vis[v]=;
int pos;
for(int i=;i<n;i++)dis[i]=mp[v][i];
for(int i=;i<n;i++){
int minn=INF;
for(int j=;j<n;j++){
if(dis[j]<minn&&vis[j]==){
pos=j;
minn=dis[j];
}
}
vis[pos]=;
for(int j=;j<n;j++){
if(dis[pos]+mp[pos][j]<dis[j]&&vis[j]==)
dis[j]=dis[pos]+mp[pos][j];
}
}
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
init();
for(int i=;i<m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(z<mp[x][y])
mp[x][y]=mp[y][x]=z;
}
int v0,v;
scanf("%d%d",&v0,&v);
if(v0==v){
cout<<<<endl;
continue;
}
Dijkstra(v0,v);
if(dis[v]==INF)cout<<-<<endl;
else
cout<<dis[v]<<endl; }
}
Dijkstra +优先队列优化
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include<cstdlib>
#include<string>
#define eps 0.000000001
typedef long long ll;
typedef unsigned long long LL;
using namespace std;
const int N=+;
const int INF=0x3f3f3f3f;
int m,n;
struct node{
int to,next,w;
bool operator<(const node &a)const{
return w>a.w;
}
}edge[N];
int head[N];
int t;
int vis[N],dis[N];
void init(){
memset(vis,,sizeof(vis));
t=;
memset(head,-,sizeof(head));
for(int i=;i<N;i++)dis[i]=INF;
}
void add(int u,int v,int w){
edge[t].to=v;
edge[t].w=w;
edge[t].next=head[u];
head[u]=t++;
}
int Dijkstra(int x){
dis[x]=;
node t1,t2;
priority_queue<node>q;
t1.to=x;
q.push(t1);
while(!q.empty()){
t1=q.top();
q.pop();
int u=t1.to;
if(vis[u]==)continue;
vis[u]=;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].to;
if(vis[v]==&&dis[v]>dis[u]+edge[i].w){
dis[v]=dis[u]+edge[i].w;
t2.to=v;
t2.w=dis[v];
q.push(t2);
}
}
} }
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
init();
for(int i=;i<m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
int x,y;
scanf("%d%d",&x,&y);
Dijkstra(x);
if(dis[y]==INF)cout<<-<<endl;
else
cout<<dis[y]<<endl; }
}
spfa算法求最短路
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string.h>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<cmath>
typedef long long ll;
typedef unsigned long long LL;
using namespace std;
const double PI=acos(-1.0);
const double eps=0.0000000001;
const int INF=0x3f3f3f3f;
const int N=+;
int n,m;
struct node{
int w,next,to;
}edge[N<<];
int head[N];
int tot;
void init(){
memset(head,-,sizeof(head));
tot=;
}
void add(int u,int v,int w){
edge[tot].to=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot++;
}
int dis[N];
int vis[N];
void spfa(int s){
queue<int>q;
memset(dis,INF,sizeof(dis));
dis[s]=;
memset(vis,,sizeof(vis));
q.push(s);
vis[s]=;
while(!q.empty()){
int x=q.front();
q.pop();
vis[x]=;
for(int i=head[x];i!=-;i=edge[i].next){
int v=edge[i].to;
if(dis[x]+edge[i].w<dis[v]){
dis[v]=dis[x]+edge[i].w;
if(vis[v])continue;
vis[v]=;
q.push(v);
} }
}
}
int main(){
while(cin>>n>>m){
init();
for(int i=;i<m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
int u,v;
scanf("%d%d",&u,&v);
spfa(u);
if(dis[v]==INF)cout<<-<<endl;
else{
cout<<dis[v]<<endl;
}
}
}
hdu 1874(最短路 Dilkstra +优先队列优化+spfa)的更多相关文章
- POJ 1511 Invitation Cards(单源最短路,优先队列优化的Dijkstra)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 16178 Accepted: 526 ...
- 最短路--dijkstra+优先队列优化模板
不写普通模板了,还是需要优先队列优化的昂 #include<stdio.h> //基本需要的头文件 #include<string.h> #include<queue&g ...
- HDU 2544 最短路(floyd+bellman-ford+spfa+dijkstra队列优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找点1到点n的最短路(无向图) 练一下最短路... dijkstra+队列优化: #i ...
- hdu 1874 畅通工程续(模板题 spfa floyd)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 spfa 模板 #include<iostream> #include<stdio ...
- HDU 2066 最短路floyd算法+优化
http://acm.hdu.edu.cn/showproblem.php?pid=206 题意 从任意一个邻居家出发 到达任意一个终点的 最小距离 解析 求多源最短路 我想到的是Floyd算法 但是 ...
- 拓扑排序 - hdu 1285(普通和优先队列优化)
2017-09-12 19:50:58 writer:pprp 最近刚开始接触拓扑排序,拓扑排序适用于:无圈图的顶点的一种排序, 用来解决有优先级别的排序问题,比如课程先修后修,排名等. 主要实现:用 ...
- POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...
- Gym 101873C - Joyride - [最短路变形][优先队列优化Dijkstra]
题目链接:http://codeforces.com/gym/101873/problem/C 题意: 这是七月的又一个阳光灿烂的日子,你决定和你的小女儿一起度过快乐的一天.因为她真的很喜欢隔壁镇上的 ...
- ZOJ - 3946-Highway Project(最短路变形+优先队列优化)
Edward, the emperor of the Marjar Empire, wants to build some bidirectional highways so that he can ...
随机推荐
- 移动web——bootstrap如何修改原组件
基本介绍 1.bootstrap提供了丰富的组件,但是有时候我们不仅要删除不必要的标签,还需要修改里面的样式 2.我们建议若是修改样式那么最好将源样式从css中拷贝出来,名字换掉,然后修改具体样式,这 ...
- 易买网之smartupload实现文件上传
经过俩个星期的奋斗,易买网项目完工.在之前,实现图片的上传,走过许多弯路,原来是好多基础的知识忘记了,没把smartupload文件包添加组件jar包至WEB-INF/lib包中,在此特别重视,做下文 ...
- HDU_1068_Girls and Boys_二分图匹配
Girls and Boys Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Java单元测试 - TestNG
官网 Eclipse安装TestNG插件 与Junit相比 从Junit发展而来,开发者就是Junit小组的一个人 Test Suite不再需要硬编码,就像cf自动登录的脚本中一样,可以写到一个xml ...
- Spring装配之——JAVA代码装配Bean
首先创建几个普通的JAVA对象,用于测试JAVA代码装配bean的功能. package soundsystemJava; //作为接口 定义了CD播放器对一盘CD所能进行的操作 public int ...
- yum仓库配置ftpx协议
[root@localhost ~]# iptables -F[root@localhost ~]# systemctl stop firewalld[root@localhost ~]# syste ...
- JavaScript:一句代码输出重复字符串(字符串乘法)
看到一个题目要求写一个函数times,输出str重复num次的字符串. 比如str:bac num:3 输出:abcabcabc 除了利用循环还有几种方法,我学习研究之后记下以下三种方法. 1 ...
- js 随机数范围
Math.floor(Math.random()*(high-low+1) +low)
- Linux常用解压缩命令
压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称 查 询:tar -jtv -f filename.tar.bz2 解压缩:tar -jxv -f filen ...
- LA 4329 Ping pong
#include <iostream> #include <cstring> #include <cstdio> using namespace std; ; ; ...