Deliver the Cake (拆点 dijkstra)

    科技2026-09-20  2

    传送门 这道题主要是建边麻烦,而稍微省点麻烦的就是拆点进行建边了,将所有 M M M 的点拆成左跟右,按部就班按照题目意思进行建边

    #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; template <typename T> inline void read(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=1e5+10; const int M=3e6+10; int head[N<<1],cnt; struct edge{ int next,to; ll w; }e[M]; void add(int u,int v,ll w){ e[cnt].to=v; e[cnt].next=head[u]; e[cnt].w=w; head[u]=cnt++; } int st,ed; struct node{ int v; ll d; node(int v,ll d):v(v),d(d){} bool friend operator<(const node &a,const node &b){ return a.d>b.d; } }; bool vis[N<<1]; ll dijkstra(){ priority_queue<node>que; que.push(node(st,0)); memset(vis,false,sizeof vis); while(!que.empty()){ node vn=que.top(); que.pop(); if(vn.v==ed){ return vn.d; } if(vis[vn.v]) continue; vis[vn.v]=1; int u=vn.v; for(int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(vis[v]) continue; que.push(node(v,vn.d+e[i].w)); } } } int n,m,s,t;ll x; char s0[N]; int main(){ ios::sync_with_stdio(false);cin.tie(nullptr); cout.tie(nullptr); int T;read(T); while(T--){ memset(head,-1,sizeof head);cnt=0; read(n),read(m),read(s),read(t),read(x); scanf("%s",s0+1); for(int i=1;i<=m;++i){ int u,v;ll w; read(u),read(v),read(w); if(s0[u]=='M'&&s0[v]=='M'){ add(u<<1,v<<1,w);add(v<<1,u<<1,w); add(u<<1,v<<1|1,w+x);add(v<<1|1,u<<1,w+x); add(u<<1|1,v<<1,w+x);add(v<<1,u<<1|1,w+x); add(u<<1|1,v<<1|1,w);add(v<<1|1,u<<1|1,w); } else if(s0[u]=='L'&&s0[v]=='L'){ add(u<<1,v<<1,w);add(v<<1,u<<1,w); } else if(s0[u]=='L'&&s0[v]=='R'){ add(u<<1,v<<1|1,w+x);add(v<<1|1,u<<1,w+x); } else if(s0[u]=='L'&&s0[v]=='M'){ add(u<<1,v<<1,w);add(v<<1,u<<1,w); add(u<<1,v<<1|1,w+x);add(v<<1|1,u<<1,w+x); } else if(s0[u]=='M'&&s0[v]=='L'){ add(u<<1,v<<1,w);add(v<<1,u<<1,w); add(u<<1|1,v<<1,w+x);add(v<<1,u<<1|1,w+x); } else if(s0[u]=='M'&&s0[v]=='R'){ add(u<<1,v<<1|1,w+x);add(v<<1|1,u<<1,w+x); add(u<<1|1,v<<1|1,w);add(v<<1|1,u<<1|1,w); } else if(s0[u]=='R'&&s0[v]=='L'){ add(u<<1|1,v<<1,w+x);add(v<<1,u<<1|1,w+x); } else if(s0[u]=='R'&&s0[v]=='M'){ add(u<<1|1,v<<1,w+x);add(v<<1,u<<1|1,w+x); add(u<<1|1,v<<1|1,w);add(v<<1|1,u<<1|1,w); } else if(s0[u]=='R'&&s0[v]=='R'){ add(u<<1|1,v<<1|1,w);add(v<<1|1,u<<1|1,w); } } st=0;ed=1; if(s0[s]=='L') add(st,s<<1,0); else if(s0[s]=='R') add(st,s<<1|1,0); else{ add(st,s<<1,0); add(st,s<<1|1,0); } if(s0[t]=='L') add(t<<1,ed,0); else if(s0[t]=='R') add(t<<1|1,ed,0); else{ add(t<<1,ed,0); add(t<<1|1,ed,0); } printf("%lld\n",dijkstra()); } return 0; }
    Processed: 0.009, SQL: 9