『题解』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;
}