結果
| 問題 |
No.2301 Namorientation
|
| コンテスト | |
| ユーザー |
ゆにぽけ
|
| 提出日時 | 2023-10-15 15:07:16 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 360 ms / 3,000 ms |
| コード長 | 1,656 bytes |
| コンパイル時間 | 1,316 ms |
| コンパイル使用メモリ | 134,032 KB |
| 最終ジャッジ日時 | 2025-02-17 07:54:04 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 30 |
ソースコード
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#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>
using namespace std;
int N,A[2 << 17],B[2 << 17],seen[2 << 17],finished[2 << 17],depth[2 << 17];
vector<int> tmp,G[2 << 17];
int s = -1;
void dfs(int u,int p)
{
seen[u] = 1;
tmp.push_back(u);
for(int v:G[u])
{
if(finished[v] || v == p) continue;
if(seen[v] && !finished[v])
{
s = v;
return;
}
dfs(v,u);
if(s >= 0) return;
}
tmp.pop_back();
finished[u] = 1;
}
set<int> C;
void dfs2(int u,int p,int d)
{
depth[u] = d;
for(int v:G[u]) if(v != p && !C.count(v)) dfs2(v,u,d+1);
}
void solve()
{
cin >> N;
for(int i = 0;i < N;i++)
{
cin >> A[i] >> B[i],A[i]--,B[i]--;
G[A[i]].push_back(B[i]);
G[B[i]].push_back(A[i]);
}
dfs(0,-1);
set<pair<int,int>> ST;
int pu = -1,su = -1;
while(1)
{
int u = tmp.back();
tmp.pop_back();
C.insert(u);
if(pu >= 0) ST.insert(make_pair(pu,u));
else su = u;
pu = u;
if(u == s) break;
}
ST.insert(make_pair(s,su));
for(int r : C) dfs2(r,-1,0);
for(int i = 0;i < N;i++)
{
int u = A[i],v = B[i];
if(C.count(u) && C.count(v))
{
if(ST.count(make_pair(u,v))) cout << "->\n";
else
{
assert(ST.count(make_pair(v,u)));
cout << "<-\n";
}
}
else
{
if(depth[u] < depth[v]) cout << "<-\n";
else cout << "->\n";
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
//tanosimu
int tt = 1;
//cin >> tt;
while(tt--) solve();
}
ゆにぽけ