传送门
这道题题意就不说了,主要是有一个二维数组进行 v i s vis vis 标记,因为该段路程的长度上限 B B B 仅仅只是100,所以完全可以用数组标记
d i j k s t r a dijkstra dijkstra 的优先队列排序是先二氧化碳排放量,再进行长度, v i s [ p o i n t ] [ l e n g t h ] vis[point][length] vis[point][length] 表示在点 v v v 长度为 l e n len len 的已经访问过了,直接跳过这个情况,剩下的就按部就班的 d i j k s t r a dijkstra dijkstra
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> pll;
template <typename T>
inline void rd(T& x)
{
int tmp = 1; char c = getchar(); x = 0;
while (c > '9' || c < '0') {
if (c == '-')tmp = -1; c = getchar(); }
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0'; c = getchar(); }
x *= tmp;
}
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const int N = 1e3 + 10;
const int M=1e7+10;
const double eps=1e-8;
struct Point{
double x,y;
void input(){
scanf("%lf %lf",&x,&y);
}
}st,ed,sta[N];
int B;
int C[105];
int head[N],cnt;
struct edge{
int next,to;
int w0;
}e[M];
void add(int u,int v,int w){
e[cnt].to=v;
e[cnt].next=head[u];
e[cnt].w0=w;
head[u]=cnt++;
}
struct node{
int cost,len;
int u,fa;
node(int u,int cost,int len,int fa):u(u),cost(cost),len(len),fa(fa){
}
bool friend operator<(const node &a,const node &b){
if(a.cost==b.cost) return a.len>b.len;
return a.cost>b.cost;
}
};
int n;
bool vis[N][105];
int dis[N][N];
int dijkstra(){
priority_queue<node>que;
que.push(node(n,0,0,-1));
memset(vis,false,sizeof vis);
int ans=inf,len,cost,v;
while(!que.empty()){
node vn=que.top();que.pop();
if(vn.u==n+1){
return vn.cost;
}
if(vis[vn.u][vn.len]) continue;
vis[vn.u][vn.len]=true;
for(int i=head[vn.u];~i;i=e[i].next){
v=e[i].to;
if(v==vn.fa) continue;
len=dis[vn.u][v];
if(vn.len+len>B||vis[v][vn.len+len]) continue;
cost=len*e[i].w0;
que.push(node(v,vn.cost+cost,vn.len+len,v));
}
}
return -1;
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
memset(head,-1,sizeof head);cnt=0;
st.input();ed.input();
rd(B);
rd(C[0]);int T;rd(T);
for(int i=1;i<=T;++i) rd(C[i]);
rd(n);
for(int i=0;i<n;++i){
sta[i].input();
int t;rd(t);
while(t--){
int j,mj;rd(j),rd(mj);
add(i,j,C[mj]);
add(j,i,C[mj]);
}
}
sta[n]=st;sta[n+1]=ed;
for(int i=0;i<n;++i) add(n,i,C[0]);
for(int i=0;i<=n;++i) add(i,n+1,C[0]);
for(int i=0;i<=n+1;++i){
for(int j=i+1;j<=n+1;++j){
dis[i][j]=dis[j][i]=ceil(hypot(sta[i].x-sta[j].x,sta[i].y-sta[j].y));
}
}
printf("%d\n",dijkstra());
return 0;
}