首页 > 其他分享 >地铁地图 (建图)

地铁地图 (建图)

时间:2022-08-21 20:57:05浏览次数:86  
标签:cnt ver int 地图 stops start 建图 地铁 dist

https://www.acwing.com/problem/content/description/1626/

思路:
既然用一般的建图方式不好处理这个问题,那就把他每条路线的每个站点之间两两练一条边,其实也符合正常的建图规则。还有要注意的就是info的存储,其实也可以和pre类比。

#include <iostream>
#include <cstring>
#include <queue>

#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

const int N = 10010, M = 1000010;

int n;
int h[N], e[M], w[M], line[M], ne[M], idx;
int dist[N], cnt[N], pre[N];
int stops[N];
string info[N];
bool st[N];

string get_number(int x)
{
    char res[5];
    sprintf(res, "%04d", x);
    return res;
}

void add(int a, int b, int c, int id)
{
    e[idx] = b, w[idx] = c, line[idx] = id, ne[idx] = h[a], h[a] = idx ++ ;
}

void dijkstra(int start, int end)
{
    memset(dist, 0x3f, sizeof dist);
    memset(cnt, 0x3f, sizeof cnt);
    memset(st, 0, sizeof st);

    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, start});
    dist[start] = cnt[start] = 0;

    while (heap.size())
    {
        auto t = heap.top();
        heap.pop();

        int ver = t.y;
        if (ver == end) break;
        if (st[ver]) continue;
        st[ver] = true;

        for (int i = h[ver]; ~i; i = ne[i])
        {
            int j = e[i];
            if (dist[j] > dist[ver] + w[i])
            {
                dist[j] = dist[ver] + w[i];
                cnt[j] = cnt[ver] + 1;
                pre[j] = ver;
                info[j] = "Take Line#" + to_string(line[i]) + " from " + 
                    get_number(ver) + " to " + get_number(j) + ".";
                heap.push({dist[j], j});
            }
            else if (dist[j] == dist[ver] + w[i])
            {
                if (cnt[j] > cnt[ver] + 1)
                {
                    cnt[j] = cnt[ver] + 1;
                    pre[j] = ver;
                    info[j] = "Take Line#" + to_string(line[i]) + " from " + 
                        get_number(ver) + " to " + get_number(j) + ".";
                }
            }
        }
    }

    cout << dist[end] << endl;
    vector<string> path;
    for (int i = end; i != start; i = pre[i])
        path.push_back(info[i]);

    for (int i = path.size() - 1; ~i; i -- )
        cout << path[i] << endl;
}

int main()
{
    cin >> n;
    memset(h, -1, sizeof h);
    for (int i = 1; i <= n; i ++ )
    {
        int m;
        cin >> m;
        for (int j = 0; j < m; j ++ ) cin >> stops[j];

        for (int j = 0; j < m; j ++ )
            for (int k = 0; k < j; k ++ )
            {
                int len;
                if (stops[0] != stops[m - 1]) len = j - k;
                else len = min(j - k, m - 1 - j + k);

                add(stops[j], stops[k], len, i);
                add(stops[k], stops[j], len, i);
            }
    }

    int k;
    cin >> k;
    while (k -- )
    {
        int start, end;
        cin >> start >> end;
        dijkstra(start, end);
    }

    return 0;
}


标签:cnt,ver,int,地图,stops,start,建图,地铁,dist
From: https://www.cnblogs.com/xjtfate/p/16610840.html

相关文章

  • 在线地图
    https://www.acwing.com/problem/content/description/1603/思路:常见的最短路题型,只不过这题要做两次dijk。#include<bits/stdc++.h>usingnamespacestd;constint......
  • WMTS地图服务每一层级分辨率
    目录1.概述2.详论2.1.Web墨卡托2.2.大地经纬度3.参考1.概述WMTS地图服务每一层级的分辨率是多少?关于这个问题以前推算过,但总是忘记了。网上查询又是一堆废话,现在把......
  • MarkDown 本地图片快速上传到博客园
    到.NETDownloads下载.NET5打开CMD之类的终端,运行dotnettoolinstall--globaldotnet-cnblog安装dotnet-cnblogs-tool到博客后台创建Token,并复制运行......
  • 1026 [NOIP2001]Car的旅行路线 标点建图 勾股定理 floyd
     链接:https://ac.nowcoder.com/acm/contest/26077/1026来源:牛客网题目描述又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个......
  • 天地图添加多个覆盖物,点击切换选中icon
    天地图添加多个覆盖物,点击覆盖物,切换选中的icon,移除之前的icon,再次点击移除之前的。。。importReact,{useState,useEffect,useRef}from'react';import{useUp......
  • uni-app中调用高德地图去设置点和轨迹
    盒子部分<viewstyle="width:100%;height:100%"id="busContainer"></view>样式部分.originImg{width:72rpx;height:100rpx;img{width:100......
  • 在uni-app中调用高德地图去导航
    1.判断一下是不是在微信环境2.微信环境调用微信自带的地图导航3.h5环境跳转去高德地图guide(){letself=this;console.log("self.lat",self.lat,......
  • 1015 [USACO 2010 Dec S]Apple Delivery 最短路 建图
     链接:https://ac.nowcoder.com/acm/contest/26077/1015来源:牛客网题目描述Bessiehastwocrispredapplestodelivertotwoofherfriend......
  • 1012 小雨坐地铁 分层图 最短路
     链接:https://ac.nowcoder.com/acm/contest/26077/1012来源:牛客网题目描述小雨所在的城市一共有mmm条地铁线,分别标号为1号线,2号线,……,m......
  • 手绘地图制作的关键点之“实时导航”
    接上文《手绘地图制作的关键点之“图层覆盖”》,继续来聊聊手绘地图另外一个关键点。那就是“实时导航”。作者:轻轻的烟雾(z281099678)之前在《景区手绘地图(电子地......