畅通工程续

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 50537    Accepted Submission(s): 18852

Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数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),分别代表起点和终点。
Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
Sample Input
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2
Sample Output
2
-1
Author
linle
Source
 
1》Dijkstra算法求最短路
#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)的更多相关文章

  1. POJ 1511 Invitation Cards(单源最短路,优先队列优化的Dijkstra)

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 16178   Accepted: 526 ...

  2. 最短路--dijkstra+优先队列优化模板

    不写普通模板了,还是需要优先队列优化的昂 #include<stdio.h> //基本需要的头文件 #include<string.h> #include<queue&g ...

  3. HDU 2544 最短路(floyd+bellman-ford+spfa+dijkstra队列优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找点1到点n的最短路(无向图) 练一下最短路... dijkstra+队列优化: #i ...

  4. hdu 1874 畅通工程续(模板题 spfa floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 spfa 模板 #include<iostream> #include<stdio ...

  5. HDU 2066 最短路floyd算法+优化

    http://acm.hdu.edu.cn/showproblem.php?pid=206 题意 从任意一个邻居家出发 到达任意一个终点的 最小距离 解析 求多源最短路 我想到的是Floyd算法 但是 ...

  6. 拓扑排序 - hdu 1285(普通和优先队列优化)

    2017-09-12 19:50:58 writer:pprp 最近刚开始接触拓扑排序,拓扑排序适用于:无圈图的顶点的一种排序, 用来解决有优先级别的排序问题,比如课程先修后修,排名等. 主要实现:用 ...

  7. POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...

  8. Gym 101873C - Joyride - [最短路变形][优先队列优化Dijkstra]

    题目链接:http://codeforces.com/gym/101873/problem/C 题意: 这是七月的又一个阳光灿烂的日子,你决定和你的小女儿一起度过快乐的一天.因为她真的很喜欢隔壁镇上的 ...

  9. ZOJ - 3946-Highway Project(最短路变形+优先队列优化)

    Edward, the emperor of the Marjar Empire, wants to build some bidirectional highways so that he can ...

随机推荐

  1. 【sqli-labs】 less53 GET -Blind based -Order By Clause -String -Stacked injection(GET型基于盲注的字符型Order By从句堆叠注入)

    http://192.168.136.128/sqli-labs-master/Less-53/?sort=1';insert into users(id,username,password) val ...

  2. ubuntu下Fiddler抓包

    参考 https://www.cnblogs.com/jcli/p/4474332.html https://www.jianshu.com/p/4505c732e378 1. 你要有个Mono环境, ...

  3. sysbench_memory

    对于内存而言,这里--memory-total-size=100G 就是 意味着 total number of events: 104857600 1. --memory-total-size=10 ...

  4. uva 1401

    Neal is very curious about combinatorial problems, and now here comes a problem about words. Knowing ...

  5. (C/C++学习)10.C++文件流

    说明:C++中的文件流分为三种:文件输入流.文件输出流.文件输入/输出流,其对应的类分别为 ifstream.ofstream 和 fstream .由这三个类创建类对象,完成对文件的操作.其中文件的 ...

  6. 分布式服务框架Dubbo入门案例和项目源码

    本项目源代码:http://download.csdn.net/detail/fansunion/9498406 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案, 是 ...

  7. 3D全景之ThreeJs

    3D全景之ThreeJs 一.前言 随着H5越来越多的被应用到各个领域,3D也越来越频繁的出现在各个H5案例中,今天我们就来讨论一下3D全景的实现. 据百度百科上介绍:720全景是视角超过人的正常视角 ...

  8. Navicat premium连接Oracle报ORA-12545错误

    1:ORA-12545 原因: 这里填localhost,127.0.0.1,或者远程ip.

  9. 关于python字符串format的一些花式用法

    目录: 基础 实战 前提: python中字符串的format功能非常强大,可以说完全能够替代其他的字符串使用方法,但是在后期的项目开发中使用的并不是特别的多, 以至于想用的时候会想不起来准确的使用方 ...

  10. [poj2396]Buget[上下界可行流]

    题意:有一个n*m的方阵,里面的数字未知,但是我们知道如下约束条件:每一行的数字的和每一列的数字的和某些格子有特殊的大小约束,用大于号,小于号和等于号表示问:是否存在用正数填充这个方阵的方案,满足所有 ...