結果
| 問題 | No.3561 Collect KCPC |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-31 16:59:57 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 236 ms / 6,000 ms |
| コード長 | 5,384 bytes |
| 記録 | |
| コンパイル時間 | 3,301 ms |
| コンパイル使用メモリ | 345,656 KB |
| 実行使用メモリ | 20,660 KB |
| 最終ジャッジ日時 | 2026-05-31 17:00:09 |
| 合計ジャッジ時間 | 10,112 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge1_0 |
| 純コード判定待ち |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| 部分点1 | 10 % | AC * 15 |
| 部分点2 | 20 % | AC * 15 |
| 部分点3 | 20 % | AC * 13 |
| 部分点4 | 50 % | AC * 51 |
| 合計 | 100 点 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
long long INF=1e18;
struct S{
array<array<long long,2>,6>data={{{INF,-1},{INF,-1},{INF,-1},{INF,-1},{INF,-1},{INF,-1}}};
};
int main(void){
int n,m;
cin>>n>>m;
vector<array<int,2>>v[100000];
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
v[a-1].push_back({b-1,c});
}
string s;
cin>>s;
vector<S>vis(n);
priority_queue<array<long long,4>>pq;
if(s[0]=='K'){
pq.push({0,0,1,-1});
vis[0].data[1][0]=0;
}else{
pq.push({0,0,0,-1});
vis[0].data[0][0]=0;
}
long long ans=INF;
while(!pq.empty()){
long long val=-pq.top()[0],now=pq.top()[1],cond=pq.top()[2],cd=pq.top()[3];
//cout<<val<<" "<<now+1<<" "<<cond<<" "<<cd+1<<endl;
pq.pop();
if(cond==0){
if(val!=vis[now].data[0][0])continue;
}else if(cond==1){
if(val!=vis[now].data[1][0])continue;
}else if(cond==2){
if((val!=vis[now].data[2][0]||cd!=vis[now].data[2][1])&&(val!=vis[now].data[3][0]||cd!=vis[now].data[3][1]))continue;
}else if(cond==3){
if((val!=vis[now].data[4][0]||cd!=vis[now].data[4][1])&&(val!=vis[now].data[5][0]||cd!=vis[now].data[5][1]))continue;
}
//cout<<val<<" "<<now+1<<" "<<cond<<" "<<cd+1<<endl;
for(int i=0;i<(int)v[now].size();i++){
int nx=v[now][i][0];
long long v2=v[now][i][1];
//cout<<s[now]<<s[nx];
if(cond==0&&s[nx]=='K'){
if(vis[nx].data[1][0]>v2+val){
vis[nx].data[1][0]=v2+val;
pq.push({-(v2+val),nx,1,-1});
}
}else if(cond==1&&s[nx]=='C'){
if(vis[nx].data[2][0]>v2+val){
if(vis[nx].data[2][1]==nx){
vis[nx].data[2][0]=v2+val;
pq.push({-(v2+val),nx,2,nx});
}else{
swap(vis[nx].data[2],vis[nx].data[3]);
vis[nx].data[2][0]=v2+val;
vis[nx].data[2][1]=nx;
pq.push({-(v2+val),nx,2,nx});
}
}else if(vis[nx].data[2][1]!=nx&&vis[nx].data[3][0]>v2+val){
vis[nx].data[3][0]=v2+val;
vis[nx].data[3][1]=nx;
pq.push({-(v2+val),nx,2,nx});
}
}else if(cond==2&&s[nx]=='P'){
if(vis[nx].data[4][0]>v2+val){
if(vis[nx].data[4][1]==cd){
vis[nx].data[4][0]=v2+val;
pq.push({-(v2+val),nx,3,cd});
}else{
swap(vis[nx].data[4],vis[nx].data[5]);
vis[nx].data[4][0]=v2+val;
vis[nx].data[4][1]=cd;
pq.push({-(v2+val),nx,3,cd});
}
}else if(vis[nx].data[4][1]!=cd&&vis[nx].data[5][0]>v2+val){
vis[nx].data[5][0]=v2+val;
vis[nx].data[5][1]=cd;
pq.push({-(v2+val),nx,3,cd});
}
}else if(cond==3&&s[nx]=='C'&&nx!=cd){
ans=min(ans,v2+val);
}else if(cond==0){
if(vis[nx].data[0][0]>v2+val){
vis[nx].data[0][0]=v2+val;
pq.push({-(v2+val),nx,0,-1});
}
}else if(cond==1){
if(vis[nx].data[1][0]>v2+val){
vis[nx].data[1][0]=v2+val;
pq.push({-(v2+val),nx,1,-1});
}
}else if(cond==2){
if(vis[nx].data[2][0]>v2+val){
if(vis[nx].data[2][1]==cd){
vis[nx].data[2][0]=v2+val;
pq.push({-(v2+val),nx,2,cd});
}else{
swap(vis[nx].data[2],vis[nx].data[3]);
//cout<<"~";
vis[nx].data[2][0]=v2+val;
vis[nx].data[2][1]=cd;
pq.push({-(v2+val),nx,2,cd});
}
}else if(vis[nx].data[2][1]!=cd&&vis[nx].data[3][0]>v2+val){
vis[nx].data[3][0]=v2+val;
vis[nx].data[3][1]=cd;
pq.push({-(v2+val),nx,2,cd});
}
//cout<<"^";
}else if(cond==3){
if(vis[nx].data[4][0]>v2+val){
if(vis[nx].data[4][1]==cd){
vis[nx].data[4][0]=v2+val;
pq.push({-(v2+val),nx,3,cd});
}else{
swap(vis[nx].data[4],vis[nx].data[5]);
vis[nx].data[4][0]=v2+val;
vis[nx].data[4][1]=cd;
pq.push({-(v2+val),nx,3,cd});
}
}else if(vis[nx].data[4][1]!=cd&&vis[nx].data[5][0]>v2+val){
vis[nx].data[5][0]=v2+val;
vis[nx].data[5][1]=cd;
pq.push({-(v2+val),nx,3,cd});
}
}
}
//cout<<vis[1].data[2][0]<<" "<<vis[1].data[2][1]<<" "<<vis[1].data[3][0]<<" "<<vis[1].data[3][1]<<"!"<<endl;
}
cout<<(ans==INF?-1:ans)<<endl;
return 0;
}