結果
| 問題 |
No.2780 The Bottle Imp
|
| コンテスト | |
| ユーザー |
ゆにぽけ
|
| 提出日時 | 2024-06-07 21:48:39 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,432 bytes |
| コンパイル時間 | 1,807 ms |
| コンパイル使用メモリ | 144,636 KB |
| 最終ジャッジ日時 | 2025-02-21 20:10:31 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 36 WA * 4 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <array>
#include <iterator>
#include <string>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <cassert>
#include <cmath>
#include <ctime>
#include <iomanip>
#include <numeric>
#include <stack>
#include <queue>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <bitset>
#include <random>
#include <utility>
#include <functional>
#include <chrono>
using namespace std;
struct SCC
{
private:
int N;
vector<vector<int>> G,RG;
vector<int> component,seen,order;
public:
SCC(int N_)
{
N = N_;
G.resize(N);
RG.resize(N);
component.assign(N,-1);
seen.assign(N,0);
}
int read(int M,vector<vector<int>> &H)
{
for(;M--;)
{
int u,v;
cin >> u >> v;
u--; v--;
add_edge(u,v);
}
return build(H);
}
void add_edge(int u,int v)
{
assert(0 <= u && u < N && 0 <= v && v < N);
G[u].push_back(v);
RG[v].push_back(u);
}
int build(vector<vector<int>> &H)
{
for(int u = 0;u < N;u++) if(!seen[u]) dfs(u);
reverse(order.begin(),order.end());
int K = 0;
for(int u : order) if(component[u] < 0)
{
rdfs(u,K);
K++;
}
H.resize(K);
set<pair<int,int>> connected;
for(int u = 0;u < N;u++)
{
for(int v:G[u]) if(component[u] != component[v] && !connected.count(make_pair(u,v)))
{
H[component[u]].push_back(component[v]);
connected.insert(make_pair(u,v));
}
}
return K;
}
int operator[](int u) const
{
assert(0 <= u && u < N);
return component[u];
}
void dfs(int u)
{
seen[u] = 1;
for(int v:G[u]) if(!seen[v]) dfs(v);
order.push_back(u);
}
void rdfs(int u,int k)
{
component[u] = k;
for(int v:RG[u]) if(component[v] < 0) rdfs(v,k);
}
};
void Main()
{
int N;
cin >> N;
SCC scc(N);
for(int i = 0;i < N;i++)
{
int M;
cin >> M;
for(;M--;)
{
int j;
cin >> j;
j--;
scc.add_edge(i, j);
}
}
vector<vector<int>> H;
int K = scc.build(H);
vector<int> seen(K);
queue<int> Q;
Q.push(scc[0]);
seen[scc[0]] = 1;
while(!Q.empty())
{
int u = Q.front();
Q.pop();
for(int v : H[u])
{
if(seen[v]);
else
{
seen[v] = 1;
Q.push(v);
}
}
}
for(int i = 0;i < K;i++)
{
if(seen[i]);
else
{
cout << "No\n";
return;
}
}
cout << "Yes\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int tt = 1;
/* cin >> tt; */
while(tt--) Main();
}
ゆにぽけ