HDU 1874 最直接的最短路径问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
#include <cstdio>
#include <algorithm>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int,int> pii;
#define N 205
#define M 1005
#define MAXN 0x3f3f3f3f
int y[M],d[M],next[M];
int first[N],dp[N];
int k; //写完函数后这两句话老是忘记写,所以还是这样一开始就写在一个函数里这样自己就不会忘了
void init()
{
k=;
memset(first,-,sizeof(first));
}
void add(int a,int b,int c)
{
y[k]=b,d[k]=c,next[k]=first[a];
first[a]=k;
k++;
} void dijkstra(int src)
{
priority_queue<pii,vector<pii>,greater<pii> > q;
memset(dp,0x3f,sizeof(dp));
dp[src]=,q.push(make_pair(,src));
while(!q.empty()){
while(!q.empty()&&dp[q.top().second]<q.top().first) q.pop();
if(q.empty()) break;
int u=q.top().second;
q.pop();
for(int i=first[u];i!=-;i=next[i]){
if(dp[y[i]]>dp[u]+d[i]){
dp[y[i]]=dp[u]+d[i];
q.push(make_pair(dp[y[i]],y[i]));
}
}
}
} int main()
{
int n,m,a,b,c,s,t;
while(scanf("%d%d",&n,&m)!=EOF){
init();
for(int i=;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
scanf("%d%d",&s,&t);
dijkstra(s);
if(dp[t]<MAXN) printf("%d\n",dp[t]);
else printf("%d\n",-);
} return ;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define MAXN 20010
#define N 205
int v[MAXN],d[MAXN],next[MAXN],first[N],visit[N],dp[N];
int k;//k表示路的条数 void add(int x,int y,int a)//这里添加的是无向图的边,所以进行两次
{
v[k]=y;
next[k]=first[x];
d[k]=a;
first[x]=k;
k++;
v[k]=x;
next[k]=first[y];
d[k]=a;
first[y]=k;
k++;
} int spfa(int a,int b)
{
memset(dp,0x3f,sizeof(dp));
//memset(visit,0,sizeof(visit));//这一段是没有必要的,每次spfa做完,他都会最后变为0
queue<int> q;
dp[a]=,visit[a]=;
q.push(a);
while(!q.empty()){
int c=q.front();
q.pop();
visit[c]=;
for(int i=first[c];i!=-;i=next[i]){
if(dp[v[i]]>dp[c]+d[i]){
dp[v[i]]=dp[c]+d[i];
if(!visit[v[i]]) q.push(v[i]),visit[v[i]]=;
}
}
}
if(dp[b]<0x3f3f3f3f) return dp[b];
else return -;
} int main()
{
int n,m,start,End,x,y,a;
while(scanf("%d%d",&n,&m)!=EOF){
k=;
memset(next,-,sizeof(next));
memset(first,-,sizeof(first));
for(int i=;i<m;i++){
scanf("%d%d%d",&x,&y,&a);
add(x,y,a);
}
scanf("%d%d",&start,&End);
printf("%d\n",spfa(start,End));
}
return ;
}
Floyd:
在使用Floyd时应该把矩阵每个点一开始做好初始化,主对角线上均为0;
其他定位一个最大值。
PS:这道题比较坑的地方是两地间可以有多条路,我们要判断是否为较小的路放入矩阵中
floyd是基于建立在2维矩阵中的,每次更新出一个到达 i 的最短路径,都要遍历一次矩阵,把所有其他节点到 i 点最小值不断更新出来,因为这道题城镇数目比较少,可以采取这种
复杂度为O(n^3)的方法,但是通过这个方法我们可以确定任意一点到其他点的最短路径(自我感觉类似于打表法,有木有?!),不像SPFA做一次只能找到你所需的最短路径
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 205
#define MAXN 0x3f3f3f3f
int mat[N][N]; void Floyd(int n)//为n*n的矩阵
{
for(int i=;i<n;i++){
for(int j=;j<n;j++){
for(int k=;k<n;k++){
if(mat[j][k]>mat[j][i]+mat[k][i])
mat[j][k]=mat[j][i]+mat[k][i];//i只是用来计更新次数的,实际上每更新一次,都要将整个矩阵的所有点都遍历一遍
} //所以是mat[j][k];
}
}
}
int main()
{
int n,m,start,End,x,y,a;
while(scanf("%d%d",&n,&m)!=EOF){
memset(mat,0x3f,sizeof(mat));
for(int i=;i<n;i++) mat[i][i]=;
for(int i=;i<m;i++){
scanf("%d%d%d",&x,&y,&a);
a=min(a,mat[x][y]);
mat[x][y]=a,mat[y][x]=a;//在这里要判断一下,因为两地之间可以有多条路,我们需要判断它到底是否为我们要的最短路
}
scanf("%d%d",&start,&End);
Floyd(n);
if(mat[start][End]<MAXN) printf("%d\n",mat[start][End]);
else printf("-1\n");
}
return ;
}
BellMan-ford:
在写BellMan时,没必要写first[]数组了
它执行一次只能找到固定对应的a到b的最短距离,在这一点上是远远不如Floyd的,而且复杂度为O(n*k),在数据量特别大时是不适用的
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 205
#define M 20005
#define MAXN 0x3f3f3f3f
int u[M],v[M],d[M],k;
int dp[N];
void add(int x,int y,int a)
{
u[k]=x,v[k]=y,d[k]=a;
k++;
}
void BellMan(int n,int src)
{
memset(dp,0x3f,sizeof(dp));
dp[src]=;
for(int i=;i<n;i++)
{
for(int j=;j<k;j++)
if(dp[v[j]]>dp[u[j]]+d[j])
dp[v[j]]=dp[u[j]]+d[j];
}
}
int main()
{
int n,m,start,End,x,y,a;
while(scanf("%d%d",&n,&m)!=EOF){
k=;
for(int i=;i<m;i++){
scanf("%d%d%d",&x,&y,&a);
add(x,y,a);
add(y,x,a);
}
scanf("%d%d",&start,&End);
BellMan(n,start);
if(dp[End]<MAXN) printf("%d\n",dp[End]);
else printf("-1\n");
}
return ;
}
HDU 1874 最直接的最短路径问题的更多相关文章
- HDU 1874 畅通project续 最短路径入门(dijkstra)
Problem Description 某省自从实行了非常多年的畅通project计划后,最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择,而某些方案 ...
- HDU 1874 畅通project续 (最短路径)
畅通project续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- ACM: HDU 1874 畅通工程续-Dijkstra算法
HDU 1874 畅通工程续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Desc ...
- (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。
floyd解法 今天初看dijkstra,先拿这两题练手,其他变形题还是不是很懂. 模版题,纯练打字... HDU 1874: #include <cstdio> #define MAXN ...
- hdu 2544 hdu 1874 poj 2387 Dijkstra 模板题
hdu 2544 求点1到点n的最短路 无向图 Sample Input2 1 //结点数 边数1 2 3 //u v w3 31 2 52 3 53 1 20 0 Sample Output32 ...
- POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)
POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...
- HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上: 迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...
- HDU - 1874 畅通工程续(最短路径)
d.已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. s.最短路径 c.Dijkstra单源最短路 /* Dijkstra单源最短路 权值必须是非负 单源最短路径,Dijkstra算法 ...
- hdu 1874 畅通工程续 Dijkstra
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目分析:输入起点和终点,顶点的个数,已连通的边. 输出起点到终点的最短路径,若不存在,输出-1 ...
随机推荐
- Unity3d的Sprite Packer用法介绍
我们用来做sprite 的图片,通常会留有很多空白的地方,我们在画完了sprite之后,这些地方很可能就没有什么作用了.如果想避免这些资源上的浪费,我们可以把各个sprite做成图集,把图片上的空间尽 ...
- ref 和 React.js 中的 DOM 操作
在 React.js 当中你基本不需要和 DOM 直接打交道.React.js 提供了一系列的 on*方法帮助我们进行事件监听,所以 React.js 当中不需要直接调用 addEventListen ...
- iOS 自己手动添加编译警告
文/青花瓷的平方(简书作者)原文链接:http://www.jianshu.com/p/b2e30cad2a0d著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 缘由 上一次生产环境我们 ...
- JDBC的fetchsize和maxrows
在我们的项目开发中,可能有把SQL查询的结果保存到CSV然后提供下载的功能.当查询的结果集相当大的时候,很容易报内存不足错误(outofmemory).那该怎么解决这种情况的内存不足错误呢? 其实在J ...
- [Github筆記] 清除所有 Commit 紀錄
# 把原來的 git 移除掉 sudo rm .git -r # 初始化 git init git remote add origin https://github.com/username/repo ...
- Elasticsearch 插入地理索引文档一直为空
今天在获取插入索引数据的时候,一直提示插入不成功,尝试了很多方法,原来是因为在插入的时候应该先 插入Latitude后插入longitude修改后的代码如下 public boolean insert ...
- .net MVC下跨域Ajax请求(JSONP)
一.JSONP(JSON with Padding) 客户端: <script type="text/javascript"> function TestJsonp() ...
- Calling method 'get' is not valid without an active transaction
在进行使用注解来配置Spring和Hibernate的整合的时候, 遇到了这个问题, 它的意思是说在调用'get'方法的时候,没有活动的事务. 原因分析: Hibernate强制要求在进行数据库操作的 ...
- js实现复制input的value到剪切板
<button class="button-code button-copy">复制链接</button><script> $(".b ...
- Vickers Vane Pump - Hydraulic Vane Pump Failure: Cavitation, Mechanical Damage
One of our readers recently wrote to me about the following questions: “Recently, we purchased a sec ...