結果
| 問題 |
No.2464 To DAG
|
| コンテスト | |
| ユーザー |
Nachia
|
| 提出日時 | 2023-08-18 03:25:34 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 215 ms / 2,000 ms |
| コード長 | 1,508 bytes |
| コンパイル時間 | 767 ms |
| コンパイル使用メモリ | 82,712 KB |
| 最終ジャッジ日時 | 2025-02-16 09:02:49 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 39 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N; cin >> N;
int M; cin >> M;
vector<vector<int>> adj(N);
for(int i=0; i<M; i++){
int u, v; cin >> u >> v;
u--; v--;
adj[u].push_back(v);
}
vector<int> adj_at(N, 0);
vector<int> visiting(N, 0);
// mark edges in eliminated cycles : adj[v][i] = -1
auto dfs = [&](auto& dfs, int v) -> int {
visiting[v] = 1;
while(adj_at[v] < (int)adj[v].size()){
int w = adj[v][adj_at[v]];
if(visiting[w]){
adj[v][adj_at[v]] = -1;
adj_at[v]++;
visiting[v] = 0;
return w;
}
int res = dfs(dfs, w);
if(res >= 0){
adj[v][adj_at[v]] = -1;
if(res != v){
visiting[v] = 0;
adj_at[v]++;
return res;
}
}
adj_at[v]++;
}
visiting[v] = 0;
return -1;
};
for(int s=0; s<N; s++) dfs(dfs, s);
vector<pair<int, int>> ans;
for(int v=0; v<N; v++){
for(int w : adj[v]) if(w != -1){
ans.push_back({ v, w });
}
}
cout << N << ' ' << ans.size() << '\n';
for(auto a : ans){
cout << (a.first + 1) << ' ' << (a.second + 1) << '\n';
}
return 0;
}
Nachia