思路:spfa求出每个点到其余顶点的最短路(最短路上的每个点的val都小于等于起点的val),然后又二维数组dp来保存,最后询问的时候就是枚举中间点i了,min{dp[i][u]+dp[i][v]+cost[i]};

题目链接

/*****************************************
Author      :Crazy_AC(JamesQi)
Time        :
File Name   :
*****************************************/
#include <iostream>
#include <algorithm>
#include <string>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <limits.h>
using namespace std;
#define FILL(a,b) memset(a,b,sizeof a)
#define CLR(a) memset(a,0,sizeof a)
template<class T> inline T Get_Max(const T&a,const T&b) {return a < b?b:a;}
template<class T> inline T Get_Min(const T&a,const T&b) {return a < b?a:b;}
const int maxn = 110;
const int inf = 1 << 30;
int dis[maxn],mark[maxn],cost[maxn],dp[maxn][maxn];
int n,m,q;
struct Edge{
    int to,w;
    Edge(){}
    Edge(int to,int w):to(to),w(w){}
};
vector<vector<Edge> > G;
void spfa(int st)
{
    // FILL(dis,inf);
    fill(dis,dis + n + 2,inf);
    // memset(dis,inf,sizeof dis);
    // printf("%d\n",dis[1]);
    FILL(mark,0);
    queue<int> que;
    dis[st] = 0;
    mark[st] = 1;
    que.push(st);
    while(!que.empty())
    {
        int u = que.front();
        que.pop();
        mark[u] = 0;
        for (int i = 0;i < G[u].size();i++)
        {
            int v = G[u][i].to;
            int w = G[u][i].w;
            if (dis[v] > dis[u] + w && cost[v] <= cost[st])
            {
                dis[v] = dis[u] + w;
                if (!mark[v])
                {
                    mark[v] = 1;
                    que.push(v);
                }
            }
        }
    }
    for (int i = 1;i <= n;i++)
    {
        // printf("%d ",dis[i]);
        dp[st][i] = dis[i];
    }
    // printf("\n");
}
int main()
{
    // freopen("in.txt","r",stdin);
    // freopen("out.txt","w",stdout);
    int iCase = 0;
    while(scanf("%d%d%d",&n,&m,&q) != EOF)
    {
        if (n == 0 && m == 0 && q == 0) break;
        for (int i = 1;i <= n;i++)
            scanf("%d",&cost[i]);
        G.clear();
        G.resize(n + 2);
        int a,b,c;
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&c);
            G[a].push_back(Edge(b,c));
            G[b].push_back(Edge(a,c));
        }
        // FILL(dp,inf);
        for (int i = 1;i <= n;i++)
            for (int j = 1;j <= n;j++)
                dp[i][j] = inf;
        for (int i = 1;i <= n;i++)
            spfa(i);
        if (iCase) puts("");
        printf("Case #%d\n",++iCase);
        while(q--)
        {
            int u,v;
            int ans = inf;
            scanf("%d%d",&u,&v);
            for (int i = 1;i <= n;i++)
            {
                if (dp[i][u] == inf || dp[i][v] == inf) continue;
                ans = Get_Min(ans,dp[i][u] + dp[i][v] + cost[i]);
            }
            if (ans == inf) printf("-1\n");
            else printf("%d\n",ans);
        }
    }
    return 0;
}

uva10246最短路 + 枚举 + 数组记忆相关推荐

  1. C#基础之结构体枚举数组

    枚举 枚举的话,主要有两个比较吸引我的地方:一.规范常量的声明.使用和存储:二.不用记忆,方便枚举值的使用.     从规范性上来说,主要是避免同一类别的不同命名问题.诸如,在我们需要存储用户性别时, ...

  2. UVALive 6885 Flowery Trails 最短路枚举

    题目连接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=129723 题意: 给你一个n点m图的边 1到n有多条最短路 ...

  3. 山东省第五届省赛题C Colorful Cupcakes(五维数组+记忆化搜索)

    在写题目之前先来介绍一下记忆化搜索. 算法上依然是搜索的流程,但是搜索到的一些解用动态规划那种思想和模式保存.一般来说,动态规划总要遍历所有的状态,而搜索可以排除一些无效的状态.最最最最最主要的是,搜 ...

  4. POJ #1062 昂贵的聘礼 有限制的最短路 枚举+dijkstra求最短路

    Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...

  5. hdu 2363(最短路+枚举)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2363 思路:和之前hdu上做过的一题很像...就是先求求出所有的高度差,排序后枚举,每次都一次spfa ...

  6. LOJ #2316「NOIP2017」逛公园【最短路】【记忆化搜索】

    dis[i]dis[i]dis[i]表示111号点到iii号点的最短距离,用spfaspfaspfa跑一遍即可. 考虑如何设定状态. 注意到题意要的是小于等于dis[n]+Kdis[n]+Kdis[n ...

  7. codeforces144——D. Missile Silos(最短路+枚举)

    codeforces144--D. Missile Silos 原题链接 题意: 给定一个n点m边的无向图,给定起点,求和起点最短距离为l的点有多少个(可以是点也可以在边上) 思路: 首先求一遍最短路 ...

  8. 最短路的那些有趣的模型(不定期更新)

    除起点与终点外,必须在规定的点上走. 将floyd的最外层设为规定的点而不是所有点. 最短路必须经过一些点,多组询问. 先求出所有点到这些点的最短路(反图dijkstra或Floyd),然后枚举min ...

  9. 形象的列举-C# 枚举

    文章目录 简介 例子 分析点拨 博主写作不容易,孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 简介 枚举类型用于声明一组命名常数. 定义枚举类型语法格式如下: enum 枚举数组名{枚举成员列表 ...

  10. 最短路计数(dp+最短路)

    Description 给出一个 n 个顶点 m 条边的无向无权图,顶点编号为 1 到 n. 问从顶点 1 开始,到其他每个点的最短路有几条. Input 第一行 2 个正整数 n, m  ( 1 ≤ ...

最新文章

  1. 【SeeMusic】音频编辑 ( 进入音频编辑页面 | 音频延迟设置 )
  2. 题解报告:hdu 5695 Gym Class(拓扑排序)
  3. Zookeeper内部的简单细节(一)
  4. 机器学习付费专栏的一些简介
  5. 操作系统上机题目(多进程2)
  6. 【C语言】将输入的10个数排序
  7. 计算机有没有开启ntp服务器,让你的Windows电脑成为一台NTP校时服务器
  8. Google Chrome 开发进度 官方Blog
  9. SecureCRT连接阿里云ECS服务器,经常掉线的解决方案
  10. [Hive]Hive常用的优化方法
  11. java 打包工具_Java打包Windows安装程序
  12. 【元胞自动机】基于matlab激进策略元胞自动机三车道(开放辅路,软件园影响)交通流模型【含Matlab源码 1298期】
  13. 乔布斯自传预售即夺下销售冠军
  14. VUE小需求——旋转小图标
  15. 芯片制造工艺中的衡量指标
  16. Webmin 远程命令执行漏洞(CVE-2019-15107)
  17. 【spring事务管理】
  18. 一个小白对接电子面单的哪些坑?
  19. 东风日产全新劲客首次搭载BOSE PERSONAL PLUS音响;艾比森举办秋季发布会推出多个新品 | 全球TMT...
  20. 大话赛宁云 | 演系列-超仿真网络空间“演武场”

热门文章

  1. Power BI数据可视化
  2. Global Shutter(全局快门)与Rolling Shutter(卷帘快门)的区别与比较
  3. Python xlsx转xls xls文件修复
  4. 移动端登录后,携带token请求其他页面接口提示token验证失败
  5. 塔夫斯大学计算机教授,塔夫茨大学工程学院虚拟教室取得成功!
  6. 幻想破灭!为何“每个儿童一台笔记本电脑”项目屡屡陷入困境?
  7. 计算机网络原理 实验3《IP数据包捕获及数据分析》
  8. html5文字布局排版欣赏,用文字作为主体排版的15个网页设计案例
  9. 一个词语解释了我万千的苦闷
  10. SIMPLE ONLINE AND REALTIME TRACKING