結果
| 問題 | No.3784 01 Walk |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-09-21 05:45:13 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 473 ms / 2,000 ms |
| + 54µs | |
| コード長 | 2,059 bytes |
| 記録 | |
| コンパイル時間 | 1,804 ms |
| コンパイル使用メモリ | 197,876 KB |
| 実行使用メモリ | 47,240 KB |
| 最終ジャッジ日時 | 2026-10-30 20:55:35 |
| 合計ジャッジ時間 | 25,778 ms |
|
ジャッジサーバーID (参考情報) |
judge4_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 40 |
ソースコード
#include <iostream>
#include <vector>
#include <atcoder/scc>
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<int,int>>> graph(2*n);
atcoder::scc_graph g(2*n);
for(int i=0;i<m;i++){
int u,v,c;
cin>>u>>v>>c;
u--;v--;
graph[u].push_back(make_pair(v+n,2*c-1));
graph[u+n].push_back(make_pair(v,1-2*c));
g.add_edge(u,v+n);
g.add_edge(u+n,v);
}
auto sccs=g.scc();
int k=sccs.size();
int inf=1e9;
vector<int> pot(2*n,inf);
vector<int> sccid(2*n,-1);
// そのSCCに非零閉路が存在するかどうか
vector<bool> bad(k);
vector<vector<pair<int,int>>> biggraph(k);
for(int i=0;i<k;i++){
auto scc=sccs[i];
for(int x:scc)sccid[x]=i;
pot[scc[0]]=0;
// 非零閉路があるとtrue,そうでなければfalse
auto dfs=[&](auto dfs,int x)->bool{
for(auto[y,w]:graph[x]){
if(sccid[y]!=i)continue;
if(pot[y]==inf){
pot[y]=pot[x]+w;
if(dfs(dfs,y))return true;
}else if(pot[y]!=pot[x]+w)return true;
}
return false;
};
if(dfs(dfs,scc[0]))bad[i]=true;
}
for(int i=0;i<k;i++){
auto scc=sccs[i];
for(int x:scc){
for(auto[y,w]:graph[x]){
if(sccid[y]!=i){
biggraph[i].push_back(make_pair(sccid[y],pot[x]+w-pot[y]));
}
}
}
}
vector<bool> reached(k);
vector<int> maxdp(k,-inf),mindp(k,inf);
reached[sccid[0]]=true;
maxdp[sccid[0]]=-pot[0];
mindp[sccid[0]]=-pot[0];
for(int i=0;i<k;i++){
if(!reached[i])continue;
if(bad[i]){
for(auto[j,w]:biggraph[i]){
reached[j]=true;
bad[j]=true;
}
}else{
for(auto[j,w]:biggraph[i]){
reached[j]=true;
maxdp[j]=max(maxdp[j],maxdp[i]+w);
mindp[j]=min(mindp[j],mindp[i]+w);
}
}
}
for(int i=0;i<n;i++){
if(bad[sccid[i]]||bad[sccid[i+n]])cout<<-1<<endl;
else{
int ans=0;
if(reached[sccid[i]])ans=max({ans,maxdp[sccid[i]]+pot[i],-(mindp[sccid[i]]+pot[i])});
if(reached[sccid[i+n]])ans=max({ans,maxdp[sccid[i+n]]+pot[i+n],-(mindp[sccid[i+n]]+pot[i+n])});
cout<<ans<<endl;
}
}
}