SHOI2012回家的路

Posted tqr06

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SHOI2012回家的路相关的知识,希望对你有一定的参考价值。

2046年OI城的城市轨道交通建设终于全部竣工,由于前期规划周密,建成后的轨道交通网络由2n条地铁
线路构成,组成了一个n纵n横的交通网。如下图所示,这2n条线路每条线路都包含n个车站,而每个车站
都在一组纵横线路的交汇处。
出于建设成本的考虑,并非每个车站都能够进行站内换乘,能够进行站内换乘的地铁站共有m个,在下图
中,标上方块标记的车站为换乘车站。已知地铁运行1站需要2分钟,而站内换乘需要步行1分钟。
Serenade想要知道,在不中途出站的前提下,他从学校回家最快需要多少时间(等车时间忽略不计)

具体的题解明天写吧 回寝室睡觉了

#include <bits/stdc++.h>
#define N 400005
#define M 2000005
using namespace std;

int n,m,S,T;

struct Edge

    int next,to,dis;
edge[M];
int cnt=0,head[N];

template<class T>inline void read(T &res)

    char c;T flag=1;
    while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
    while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;


struct Road

    int x,y,id;
 a[N];

struct Node

    int v,id;
    inline friend bool operator<(Node x, Node y) return x.v>y.v;
;

inline void add_edge(int from,int to,int dis)

    edge[++cnt].next=head[from];
    edge[cnt].to=to;
    edge[cnt].dis=dis;
    head[from]=cnt;


inline bool cmp1(Road a,Road b) return a.x==b.x?a.y<b.y:a.x<b.x;

inline bool cmp2(Road a,Road b) return a.y==b.y?a.x<b.x:a.y<b.y;

int dis[N+5];
bool vis[N+5];
inline void dijkstra(int u)

    priority_queue<Node> q;
    memset(dis,0x3f,sizeof(dis));
    dis[u]=0;
    q.push((Node)0,u);
    while(!q.empty())
    
        int u=q.top().id;
        q.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(register int i=head[u];i;i=edge[i].next)
        
            int v=edge[i].to;
            if(dis[v]>dis[u]+edge[i].dis)
            
                dis[v]=dis[u]+edge[i].dis;
                if(!vis[v]) q.push((Node)dis[v],v);
            
        
    


int main()

    read(n);read(m);
    n=m+2;
    S=n-1;
    T=n;
    for(register int i=1;i<=n;++i)
    
        read(a[i].x);
        read(a[i].y);
        a[i].id=i;
    
    sort(a+1,a+n+1,cmp1);
    for(register int i=1;i<n;++i)
    
        if(a[i].x==a[i+1].x)
        
            add_edge(a[i].id,a[i+1].id,(a[i+1].y-a[i].y)<<1);
            add_edge(a[i+1].id,a[i].id,(a[i+1].y-a[i].y)<<1);
        
    
    sort(a+1,a+n+1,cmp2);
    for(register int i=1;i<n;++i)
    
        if(a[i].y==a[i+1].y)
        
            add_edge(a[i].id+n,a[i+ 1].id+n,(a[i+1].x-a[i].x)<<1);
            add_edge(a[i+1].id+n,a[i].id+n,(a[i+1].x-a[i].x)<<1);
        
    
    for(register int i=1;i<=n-2;++i)
    
        add_edge(i,i+n,1);
        add_edge(i+n,i,1);
    
    add_edge(S,S+n,0);
    add_edge(S+n,S,0);
    add_edge(T,T+n,0);
    add_edge(T+n,T,0);
    dijkstra(S);
    printf(dis[T]==0x3f3f3f3f?"-1\n":"%d\n",dis[T]);
    return 0;

以上是关于SHOI2012回家的路的主要内容,如果未能解决你的问题,请参考以下文章

SHOI2012回家的路

BZOJ 2834 回家的路

Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

使用 Power BI 分析 “回家的路”

看到故乡的方向,找到回家的路

小学生蓝桥杯Python闯关 | 回家的路