結果
| 問題 |
No.1393 Median of Walk
|
| コンテスト | |
| ユーザー |
chocorusk
|
| 提出日時 | 2021-02-13 03:49:16 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 778 ms / 2,000 ms |
| コード長 | 3,939 bytes |
| コンパイル時間 | 1,607 ms |
| コンパイル使用メモリ | 138,996 KB |
| 最終ジャッジ日時 | 2025-01-18 20:00:03 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 39 |
ソースコード
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <complex>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <cassert>
#include <fstream>
#include <utility>
#include <functional>
#include <stack>
#define popcount __builtin_popcount
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;
int main()
{
int n, m; cin>>n>>m;
vector<P> g[1010];
int u[2525], v[2525], w[2525];
vector<P> wp(m);
for(int i=0; i<m; i++){
cin>>u[i]>>v[i]>>w[i];
u[i]--; v[i]--;
g[u[i]].push_back({v[i], i});
wp[i]=P(w[i], i);
}
sort(wp.begin(), wp.end());
int ans[1010];
fill(ans, ans+n, -2);
int d[1010];
const int INF=1e9;
fill(d, d+n, INF);
d[0]=0;
for(int i=0; i<n; i++){
for(int x=0; x<n; x++){
for(auto p:g[x]){
int y=p.first;
if(d[y]>d[x]+1){
d[y]=d[x]+1;
}
}
}
}
for(int i=0; i<n; i++){
if(d[i]==INF) ans[i]=-1;
}
for(int i=0; i<m; i++){
queue<int> que1;
priority_queue<P, vector<P>, greater<P>> que;
int i1=wp[i].second;
int d2[1010];
fill(d2, d2+n, INF);
d2[v[i1]]=0;
que.push({0, v[i1]});
if(d[u[i1]]>=-INF/2 && ans[u[i1]]!=-1){
que.push({v[i1], 0});
while(!que.empty()){
P p=que.top(); que.pop();
int x=p.second;
if(d2[x]<p.first) continue;
for(auto q:g[x]){
if(q.second==i1) continue;
int y=q.first;
if(d[y]<-INF/2) continue;
int e=d[x]-d[y];
if(P(w[q.second], q.second)<=wp[i]) e--;
else e++;
if(d2[y]>d2[x]+e){
d2[y]=d2[x]+e;
que.push({d2[y], y});
}
}
}
}
if(d2[u[i1]]<INF/2 && d2[u[i1]]+d[u[i1]]-d[v[i1]]-1<0 && ans[u[i1]]!=-1){
queue<int> que2;
bool used2[1010]={};
used2[u[i1]]=1;
que2.push(u[i1]);
while(!que2.empty()){
int x=que2.front(); que2.pop();
for(auto q:g[x]){
int y=q.first;
if(!used2[y]){
used2[y]=1;
que2.push(y);
}
}
}
for(int x=1; x<n; x++){
if(used2[x]){
if(ans[x]==-2) ans[x]=wp[i].first;
d[x]=-INF;
}
}
}else{
que.push({0, 0});
int d1[1010];
fill(d1, d1+n, INF);
d1[0]=0;
while(!que.empty()){
P p=que.top(); que.pop();
int x=p.second;
if(d1[x]<p.first) continue;
for(auto q:g[x]){
int y=q.first;
if(d[y]<-INF/2) continue;
int e=d[x]-d[y];
if(P(w[q.second], q.second)<=wp[i]) e--;
else e++;
if(d1[y]>d1[x]+e){
d1[y]=d1[x]+e;
que.push({d1[y], y});
}
}
}
for(int x=0; x<n; x++){
if(ans[x]==-1) continue;
if(d[x]>=-INF/2) d[x]+=d1[x];
else d[x]=-INF;
if(ans[x]==-2 && d[x]<=0){
ans[x]=wp[i].first;
}
}
}
}
for(int x=1; x<n; x++){
cout<<ans[x]<<endl;
}
return 0;
}
chocorusk