首页 > 其他分享 >杭电OJ 2066 一个人的旅行

杭电OJ 2066 一个人的旅行

时间:2024-03-19 13:23:45浏览次数:29  
标签:OJ int graph 杭电 ++ time myPriorityQueue 2066 dis

一个人的旅行

考查图论中的单源最短路径问题,首先图的存储方式,前面说过在实际程序中一般用邻接表,为每一个顶点都分配一个单链表(向量)。由于这里顶点的总个数并不确定,用visit数组在集合T中遍历寻找下一个用来松弛的顶点,这一方式不太合适,所以这里我用优先队列,每次弹出距离起始点距离最短的顶点。

//单源最短路径-用优先队列优化每次选择距离起始顶点最短的顶点 2024-03-18 go on
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;
const int MAXN = 1000 + 10;
const int INF = INT_MAX;
struct Edge {
    int to;
    int time;
    Edge(int t, int ti):to(t), time(ti) {}
};

struct Point {
    int index;
    int distance;
    Point(int i, int d): index(i), distance(d) {}
    bool operator< (const Point &c) const {
        return distance > c.distance;
    }
};

vector<Edge> graph[MAXN];
priority_queue<Point> myPriorityQueue;

int dis[MAXN]; //保存起始点到其他顶点的最短路径

//参数1:起始顶点编号
void Dijkstra(int start) {
    fill(dis, dis + MAXN, INF);
    dis[start] = 0;
    myPriorityQueue.push(Point(start, dis[start]));
    while(!myPriorityQueue.empty()) {
        int u = myPriorityQueue.top().index;
        myPriorityQueue.pop();

        for(int i = 0; i < graph[u].size(); ++i) {
            int v = graph[u][i].to;
            int d = graph[u][i].time;
            if(dis[v] > dis[u] + d) {
                dis[v] = dis[u] + d;
                myPriorityQueue.push(Point(v, dis[v]));
            }
        }
    }
}


int main() {
    int t, s, d;
    vector<int> nearby, want2go;
    while(cin >> t >> s >> d) {
        for(int i = 0; i < t; ++i) {
            int a, b, time;
            scanf("%d%d%d", &a, &b, &time);
            graph[a].push_back(Edge(b, time));
            graph[b].push_back(Edge(a, time));
        }
        int num;
        for(int i = 0; i < s; ++i) {
            scanf("%d", &num);
            nearby.push_back(num);
        }
        for(int i = 0; i < d; ++i) {
            scanf("%d", &num);
            want2go.push_back(num);
        }
        int minimum = INF;
        for(int i = 0; i < s; ++i) {
            Dijkstra(nearby[i]);
            for(int j = 0; j < d; ++j) {
                minimum = min(minimum, dis[want2go[j]]);
            }
        }
        cout << minimum << endl;
        memset(graph, 0, sizeof(graph));
        nearby.clear();
        want2go.clear();
    }
    return 0;
}

All in is a kind of wisdom.

标签:OJ,int,graph,杭电,++,time,myPriorityQueue,2066,dis
From: https://www.cnblogs.com/paopaotangzu/p/18082551

相关文章

  • SWUST OJ 961: 进制转换问题
    题目描述建立顺序栈或链栈,编写程序实现十进制数到二进制数的转换。输入输入只有一行,就是十进制整数。输出转换后的二进制数。样例输入10样例输出1010参考程序#include<iostream>usingnamespacestd;#definemaxsize100voidconcersion(intn){ inta[maxsize......
  • NOJ南邮上机 最大公约数和最小公倍数 PROB1006 Python
    PROB1006  最大公约数和最小公倍数描述:求两个正整数的最大公约数和最小公倍数输入:两个正整数A,B输出:两个正整数的最大公约数、最小公倍数样例输入:43样例输出:112defmax_gcd(a,b):whileb!=0:temp=a%ba=bb=temp......
  • CMU15445 2022fall project2
    CMU154452022fallproject2CheckPoint1Task1B+TreePages这部分主要是给page、internal、leaf三个page类实现一些get、set方法和一些简单的函数。注意点:判断rootpage:parentpageid=INVALID_PAGE_IDGetMinSize():叶子结点为max_size_/2,内部节点为(max_size_+1)......
  • POJ3057 Evacuation 题解
    传送门题意:给定一张字符地图,#代表墙,.代表空地,D代表门。初始每个空地都有一个人。每个人可以在一秒内向上下左右移动一格。一个空地可以站任意多人。一个人走到门视作逃生成功。但是门很窄,一个时刻内只能有一个人进门。问所有人逃生的最短时间。\(n\le12\)。注意到门一个......
  • [BZOJ3306] 树
    题目[BZOJ3306]树样例输入:37011213Q1V16Q1V25Q1V34Q1样例输出:1234数据范围\({n,Q\leq10^5}\)分析\(\color{skyblue}{1}\)这道题如果没有操作换根那她就是一道板得不能再板的一道板子题但是\(\color{red}{\large没有如果!}\)所以这......
  • 杭电OJ 2072-单词数
    单词数因为新学了散列表容器map,这道题只用统计不同单词的总数,用映射再统计个数蛮合适,学以致用doge,需要注意文章开头可能有空格,最后要把空格这一映射减掉。AC代码:#include<iostream>#include<cstdio>#include<map>#include<string>usingnamespacestd;map<string,......
  • pyCharm oj 习题 列表合并、去重、排序
    列表合并、去重、排序ProblemDescription从键盘输入两个数列,构成两个列表list1、list2,合并这两个列表为list3,将list3去掉重复元素、降序排序后生成list4.InputDescription输入两个数列,以英文逗号分隔OutputDescription输出列表list1、list2、list3、list4SampleInpu......
  • [bzoj2120]数颜色/维护队列 (分块)
    数颜色/维护队列[做题笔记]此生第一道不贺题解\(AC\)的分块蓝题!!!题目描述墨墨@hs_mo购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:\(Q\L\R\)代表询问你从第\(L\)支画笔到第\(R\)支画笔中共有几种不同颜色的......
  • LibreOJ 3591 「USACO 2018.02 Platinum」Cow Gymnasts
    以\(0\)为初始下标。考虑到这个平台之间的转移不是很好处理,于是考虑换个角度,考虑每个高度。这里定义高度为\(i\)的奶牛就是下一次操作要走\(i\)步的奶牛。然后考虑去分析合法序列的性质。性质\(1\):高度为\(x\)的奶牛在移动后的高度依然为\(x\),即这个过程可以看作每......
  • LibreOJ 4114 「联合省选 2024」迷宫守卫
    因为最后的比较方式是字典序,可以明确肯定是贪心的先让第一个数尽量大,然后是第二个数尽量大,以此类推。考虑到如果选出了第一个数,那么按照其\(\text{dfs}\)的方式,相当于是把根到这个树的链删掉了,变成了许多颗子树,然后在按照\(\text{dfs}\)遍历这几个子树的顺序依次在子树中类似......