『题解』SPOJ SP34012 ADRABR - Adrita and Her Bike Ride

题目传送门

题目大意

给定一张地图,有 \(1 \le n \le 10^5\) 个路口,由 \(1 \le r \le 10^6\) 条路连接,每条路的长度均为 \(1\) 公里,并会收取一定费用 \(0 \le t \le 10^5\)。每走 1 公里需要消耗 \(12\) 塔卡。

给定起点 \(s\) 和终点 \(d\),求从 \(s\)\(d\) 的最小开销(费用与所需塔卡之和)。

多组数据(\(1 \le k \le 50\))。

思路

最短路板子。

对于每走 \(1\) 公里所需的 \(12\) 塔卡,直接算进费用里,加边时边权加上 \(12\) 即可。

由于边权不为负,我就直接用 dijkstra 了。

代码

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
template<typename T=int>
inline T read(){
    T X=0; bool flag=1; char ch=getchar();
    while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
    while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+ch-'0',ch=getchar();
    if(flag) return X;
    return ~(X-1);
}

template<typename T=int>
inline void write(T X){
    if(X<0) putchar('-'),X=~(X-1);
    T s[20],top=0;
    while(X) s[++top]=X%10,X/=10;
    if(!top) s[++top]=0;
    while(top) putchar(s[top--]+'0');
    putchar('\n');
}

typedef long long ll;
const int N=1e5+5,M=1e6+5,inf=0x3f3f3f3f;
struct edge{ // 链式前向星存图
    ll to,val,nxt;
}e[M];
ll k,n,m,s,d,u,v,w; // 输入
int head[N],top;
ll dist[N],vis[N];
priority_queue<pair<ll,int>> q; // 堆

void add(int u,int v,ll w){
    top++;
    e[top].to=v;
    e[top].val=w;
    e[top].nxt=head[u];
    head[u]=top;
}

void clear(){
    memset(head,0,sizeof(head));
    memset(vis,0,sizeof(vis));
    top=0;
}

// dij 板子
void dijkstra(){
    memset(dist,0x3f,sizeof(dist));
    dist[s]=0;
    q.push(make_pair(0,s));
    while(!q.empty()){
        int u=q.top().second;
        q.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=head[u]; i; i=e[i].nxt){
            int v=e[i].to;
            if(dist[v]>dist[u]+e[i].val){
                dist[v]=dist[u]+e[i].val;
                q.push(make_pair(-dist[v],v));
            }
        }
    }
}

int main(){
    k=read();
    while(k--){
        n=read(),m=read(),s=read(),d=read();
        while(m--){
            u=read(),v=read(),w=read()+12; // 每条路都有一公里,要多消耗12塔卡
            add(u,v,w);
            add(v,u,w);
        }
        dijkstra();
        write(dist[d]);
        clear(); // 清空不能忘
    }
    return 0;
}
posted @ 2022-07-18 20:59  仙山有茗  阅读(72)  评论(0编辑  收藏  举报