結果
| 問題 | No.3561 Collect KCPC |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-29 20:56:01 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 5,063 ms / 6,000 ms |
| コード長 | 1,261 bytes |
| 記録 | |
| コンパイル時間 | 4,156 ms |
| コンパイル使用メモリ | 351,544 KB |
| 実行使用メモリ | 21,548 KB |
| 最終ジャッジ日時 | 2026-05-29 20:57:10 |
| 合計ジャッジ時間 | 62,951 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge4_1 |
| 純コード判定待ち |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| 部分点1 | 10 % | AC * 15 |
| 部分点2 | 20 % | AC * 15 |
| 部分点3 | 20 % | AC * 13 |
| 部分点4 | 50 % | AC * 51 |
| 合計 | 100 点 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
int main(){
cin.tie(nullptr);
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
vector<vector<pair<ll,int>>> graph(n);
for(int i=0;i<m;i++){
int u,v,c;
cin>>u>>v>>c;
u--;v--;
graph[u].push_back(make_pair(c,v));
//graph[v].push_back(make_pair(c,v));
}
string s;
cin>>s;
random_device seed;
mt19937 rnd(seed());
ll inf=1e18;
ll ans=inf;
for(int _=0;_<50;_++){
vector<int> a(n);
for(int i=0;i<n;i++){
if(s[i]=='K'){
a[i]=0;
}else if(s[i]=='P'){
a[i]=2;
}else if(s[i]=='C'){
if(rnd()%2)a[i]=1;
else a[i]=3;
}else{
a[i]=-1;
}
}
vector<vector<ll>> dist(n,vector<ll>(4,inf));
dist[0][0]=0;
using P=pair<ll,ll>;
priority_queue<P,vector<P>,greater<P>> pq;
pq.push(make_pair(0,0));
while(!pq.empty()){
auto[d,vs]=pq.top();
pq.pop();
ll v=vs%n,s=vs/n;
if(dist[v][s]<d)continue;
if(s==a[v]){
if(s==3)ans=min(ans,d);
else{
if(dist[v][s+1]>d){
dist[v][s+1]=d;
pq.push(make_pair(d,n*(s+1)+v));
}
}
}
for(auto[c,u]:graph[v]){
if(dist[u][s]<=c+d)continue;
dist[u][s]=c+d;
pq.push(make_pair(c+d,s*n+u));
}
}
}
if(ans==inf)cout<<-1<<endl;
else cout<<ans<<endl;
}