백준3977 축구 전술 작성일 2019-09-11 | In PS 문제 링크 http://icpc.me/3977 사용 알고리즘 SCC 풀이 indegree가 0인 SCC가 하나만 존재해야 합니다. indegree가 0인 SCC의 모든 정점을 출력해주면 됩니다. 전체 코드 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889#include <bits/stdc++.h> using namespace std; vector<int> g[101010]; vector<int> rev[101010]; int chk[101010]; int scc[101010]; int in[101010]; vector< vector<int> > comp; vector<int> dfn; int n, m, pv; void dfs(int v){ chk[v] = 1; for(auto i : g[v]){ if(chk[i]) continue; dfs(i); } dfn.push_back(v); } void dfs_rev(int v, int color){ scc[v] = color; comp.back().push_back(v); for(auto i : rev[v]){ if(scc[i]) continue; dfs_rev(i, color); } } void getSCC(){ for(int i=0; i<n; i++) if(!chk[i]) dfs(i); reverse(dfn.begin(), dfn.end()); pv = 0; for(auto i : dfn){ if(!scc[i]){ comp.push_back(vector<int>()); dfs_rev(i, ++pv); } } } void init(){ for(int i=0; i<101010; i++) g[i].clear(), rev[i].clear(); memset(chk, 0, sizeof chk); memset(scc, 0, sizeof chk); memset(in, 0, sizeof in); for(auto &i : comp) i.clear(); comp.clear(); dfn.clear(); pv = 0; } void solve(){ init(); cin >> n >> m; for(int i=0; i<m; i++){ int a, b; cin >> a >> b; g[a].push_back(b); rev[b].push_back(a); } getSCC(); for(int i=0; i<n; i++){ for(auto j : g[i]){ if(scc[i] != scc[j]) in[scc[j]]++; } } int cnt = 0; int ans = 0; for(int i=1; i<=pv; i++){ if(in[i] == 0){ ans = i; cnt++; } } if(cnt > 1){ cout << "Confused\n"; }else{ for(int i=0; i<n; i++){ if(scc[i] == ans) cout << i << "\n"; } } cout << "\n"; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while(t--) solve(); }