基础的dijkstra问题  加上了花费

#include<bits/stdc++.h>
using namespace std; int m1[][][];
int vis[];int dis[];
#define INF 99999
int n,e,cas;
int m;
int cos1[]; void dijkstra(int v0)
{
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++){dis[i]=(i==v0?:INF);cos1[i]=(i==v0?:INF);} vis[v0]=;
for(int i=;i<n-;i++)
{
int minn=INF,u=v0;
for(int j=;j<=n;j++)
{
if(vis[j]==&&dis[j]<minn)
{
u=j;minn=dis[j]; } }
vis[u]=;
for(int j=;j<=n;j++)
{
if(dis[u]+m1[u][j][]<dis[j])
{
dis[j]=dis[u]+m1[u][j][];
cos1[j]=cos1[u]+m1[u][j][];
}
else if(dis[u]+m1[u][j][]==dis[j]&&cos1[u]+m1[u][j][]<cos1[j])
{ cos1[j]=cos1[u]+m1[u][j][];
}
} } } int main()
{
while(scanf("%d%d",&n,&m)==&&(n+m) )
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(i==j)m1[i][j][]=m1[i][j][]=;
else m1[i][j][]=m1[i][j][]=INF;
}
while(m--)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if( m1[a][b][]>c )
{
m1[a][b][]=m1[b][a][]=c;
m1[a][b][]=m1[b][a][]=d; }
else if(m1[a][b][]==c&&d<m1[a][b][])
{
m1[a][b][]=m1[b][a][]=d; } }
int s,e;
scanf("%d%d",&s,&e);
dijkstra(s);
printf("%d %d\n",dis[e],cos1[e]); } }

回顾:

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std; #define N 1005
#define inf 0x3f3f3f3f int n,e,m,s;
int vis[N],dis[N],mp[N][N];
int cost[N][N],cos[N]; void dijkstra(int s)
{
memset(vis,,sizeof vis);
for(int i=;i<=n;i++)
dis[i]=inf;
dis[s]=;
for(int i=;i<=n;i++)
cos[i]=inf;
cos[s]=;
for(int i=;i<=n;i++)
{
int minn=inf,u=-;
for(int j=;j<=n;j++)
if(dis[j]<minn&&!vis[j])
{
minn=dis[j];u=j;
}
if(u==-)return ;
vis[u]=;
for(int j=;j<=n;j++)
{
if(dis[j]>dis[u]+mp[u][j])
{
dis[j]=dis[u]+mp[u][j];
cos[j]=cos[u]+cost[u][j];
}
else if(dis[j]==dis[u]+mp[u][j])
{
cos[j]=min(cos[j],cos[u]+cost[u][j]);
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)==&&(n+m))
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(i==j)mp[i][i]=;
else mp[i][j]=inf;
if(i==j)cost[i][i]=;
else cost[i][j]=inf;
}
while(m--)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(mp[a][b]>c)
mp[a][b]=mp[b][a]=c,cost[a][b]=cost[b][a]=d;
}
scanf("%d%d",&s,&e);
dijkstra(s);
printf("%d %d\n",dis[e],cos[e]);
}
return ;
}

最短路径问题 HDU3790 (dijkstra)的更多相关文章

  1. C++编程练习(11)----“图的最短路径问题“(Dijkstra算法、Floyd算法)

    1.Dijkstra算法 求一个顶点到其它所有顶点的最短路径,是一种按路径长度递增的次序产生最短路径的算法. 算法思想: 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的 ...

  2. 最短路径问题的Dijkstra算法

      问题 最短路径问题的Dijkstra算法 是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出.迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法终于得到一个最短路径树>    ...

  3. 非负权值有向图上的单源最短路径算法之Dijkstra算法

    问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度.求解该问题的算法一般为Dijkstra算法. 假设图顶点个数为n,则针对 ...

  4. 单源最短路径问题2 (Dijkstra算法)

    用邻接矩阵 /* 单源最短路径问题2 (Dijkstra算法) 样例: 5 7 0 1 3 0 3 7 1 2 4 1 3 2 2 3 5 2 4 6 3 4 4 输出: [0, 3, 7, 5, 9 ...

  5. 最短路径问题:Dijkstra算法

    定义 所谓最短路径问题是指:如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小. 下面我们介绍两种比较常用的求最短路 ...

  6. 最短路径问题的Dijkstra和SPFA算法总结

    Dijkstra算法: 解决带非负权重图的单元最短路径问题.时间复杂度为O(V*V+E) 算法精髓:维持一组节点集合S,从源节点到该集合中的点的最短路径已被找到,算法重复从剩余的节点集V-S中选择最短 ...

  7. 网格最短路径算法(Dijkstra & Fast Marching)

    Dijkstra算法是计算图中节点之间最短路径的经典算法,网上关于Dijkstra算法原理介绍比较多,这里不再多讲.值得一提的是,当图中节点之间的权重都为1时,Dijkstra算法就变化为一般意义上的 ...

  8. 最短路径算法之Dijkstra算法(java实现)

    前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...

  9. 图中最短路径算法(Dijkstra算法)(转)

    1.Dijkstra 1)      适用条件&范围: a)   单源最短路径(从源点s到其它所有顶点v); b)   有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E ...

随机推荐

  1. Jacob用法收集

    介绍 Jacob 是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调 ...

  2. C# 反射实例

    1.接口 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  3. luogu P2516 [HAOI2010]最长公共子序列

    传送门 首先那个\(O(n^2)\)的dp都会吧,不会自己找博客或者问别人,或是去做模板题(误) 对以下内容不理解的,强势推荐flash的博客 我们除了原来记录最长上升子序列的\(f_{i,j}\), ...

  4. 洛谷 P2257 YY的GCD

    洛谷 P2257 YY的GCD \(solution:\) 这道题完全跟[POI2007]ZAP-Queries (莫比乌斯反演+整除分块) 用的一个套路. 我们可以列出答案就是要我们求: \(ans ...

  5. printf 函数的实现原理

    /* * ===================================================================================== * * Filen ...

  6. python - wmi模块学习(windwos硬件信息获取)

    获取windows操作系统的硬件信息 #!/usr/bin/env python # -*- coding: utf-8 -*- # http://www.cnblogs.com/liu-ke/ im ...

  7. JAVA中的引用

    关于值类型和引用类型的话题,C++.JAVA.python.go.C#等等高级语言都有相关的概念,只要理解了其底层工作原理,可以说即使是不同的语言,在面试学习工作实践中都可以信手拈来(不要太纠集语言) ...

  8. js代码解析原则

    js引擎在读取js代码时会进行两个步骤,第一个步骤是解释,第二个步骤是执行. 解释就是先通篇扫描所有的Js代码,然后把所有声明提升到顶端,第二步是执行,执行就是执行代码的操作. 例: 例子1: < ...

  9. DataSnap ClientdataSet 三层中主从表的操作

    非原创  摘自:http://hi.baidu.com/yagzh2000/blog/item/fc69df2cb9845de78b139946.html三层中主从表的操作(删除.新增.修改)一定要在 ...

  10. C++ virtual函数重写,在继承的时候没有在函数前写virtual关键字也依然是虚函数吗?

    比如: class Base { Base() {}; ~Base() {}; virtual void Init(); }; class Derived:public Base { virtual ...