結果
問題 | No.416 旅行会社 |
ユーザー |
![]() |
提出日時 | 2016-09-16 01:31:58 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 222 ms / 4,000 ms |
コード長 | 1,682 bytes |
コンパイル時間 | 1,107 ms |
コンパイル使用メモリ | 91,996 KB |
実行使用メモリ | 38,656 KB |
最終ジャッジ日時 | 2024-12-14 20:18:11 |
合計ジャッジ時間 | 4,579 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 21 |
ソースコード
#include <iostream>#include <vector>#include <map>#include <set>#include <queue>#include <algorithm>#include <iomanip>#include <cassert>using namespace std;#define GET_ARG(a,b,c,F,...) F#define REP3(i,s,e) for (i = s; i <= e; i++)#define REP2(i,n) REP3 (i,0,(int)(n)-1)#define REP(...) GET_ARG (__VA_ARGS__,REP3,REP2) (__VA_ARGS__)#define RREP3(i,s,e) for (i = s; i >= e; i--)#define RREP2(i,n) RREP3 (i,(int)(n)-1,0)#define RREP(...) GET_ARG (__VA_ARGS__,RREP3,RREP2) (__VA_ARGS__)#define DEBUG(x) cerr << #x ": " << x << endlint par[200000], ans[200000];vector<int> child[200000];int find(int x) {if (par[x] == x) return x;else return par[x] = find(par[x]);}void dfs(int x, int event) {ans[x] = event;for (auto y: child[x]) dfs(y,event);}void unite(int x, int y, int event) {x = find(x);y = find(y);if (x == y) return;if (x == 0) {dfs(y,event);par[y] = x;}else if (y == 0) {dfs(x,event);par[x] = y;}else {par[x] = y;child[y].push_back(x);}}vector<int> e[200000];set<int> del[200000];int C[200000], D[200000];int main(void) {int i, n, m, q;scanf("%d%d%d",&n,&m,&q);REP (i,m) {int a, b;scanf("%d%d",&a,&b);a--; b--;e[a].push_back(b);}REP (i,q) {scanf("%d%d",&C[i],&D[i]);C[i]--; D[i]--;del[C[i]].insert(D[i]);}REP (i,n) par[i] = i;REP (i,n) for (auto x: e[i]) if (!del[i].count(x)) {unite(i,x,-1);}RREP (i,q) {unite(C[i],D[i],i+1);}REP (i,1,n-1) printf("%d\n",ans[i]);return 0;}