제출 #125130

#제출 시각아이디문제언어결과실행 시간메모리
125130eriksuenderhaufPotemkin cycle (CEOI15_indcyc)C++11
60 / 100
1071 ms2424 KiB
#pragma GCC optimize("O3") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include <ext/rope> #define mem(a,v) memset((a), (v), sizeof (a)) #define enl printf("\n") #define case(t) printf("Case #%d: ", (t)) #define ni(n) scanf("%d", &(n)) #define nl(n) scanf("%I64d", &(n)) #define nai(a, n) for (int i = 0; i < (n); i++) ni(a[i]) #define nal(a, n) for (int i = 0; i < (n); i++) nl(a[i]) #define pri(n) printf("%d\n", (n)) #define prl(n) printf("%I64d\n", (n)) #define pii pair<int, int> #define pil pair<int, long long> #define pll pair<long long, long long> #define vii vector<pii> #define vil vector<pil> #define vll vector<pll> #define vi vector<int> #define vl vector<long long> #define pb push_back #define mp make_pair #define fi first #define se second using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef cc_hash_table<int,int,hash<int>> ht; typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> oset; const double pi = acos(-1); const int MOD = 1e9 + 7; const int INF = 1e9 + 7; const int MAXN = 1e3 + 5; const int MAXM = 1e5 + 5; const double eps = 1e-9; int U[MAXM], V[MAXM], ap[MAXM], mrk[MAXM]; int lo[MAXN], disc[MAXN], ti = 1, inSt[MAXN]; vi adj[MAXN]; void dfs(int u, int p=0) { lo[u] = disc[u] = ti++; for (int i: adj[u]) { int v = U[i]^V[i]^u; if (!disc[v]) { dfs(v, u); lo[u] = min(lo[u], lo[v]); if (lo[v] > disc[u]) ap[i] = 1; } else if (v != p) lo[u] = min(lo[u], disc[v]); } } stack<int> st; void solve(int u, int root, int d=0, int p=0) { disc[u] = 1; bool fl = 0; //cerr << "current node: " << u << " " << d << " " << p << "\n"; for (int i: adj[u]) { int v = U[i]^V[i]^u; if (ap[i] || v == p) continue; if (mrk[i] && inSt[v]) return; if (mrk[i]) continue; if (disc[v] && (v != root || (v == root && d <= 2))) { disc[u] = 0; return; } if (v == root && d > 2) fl = 1; } st.push(u); inSt[u] = 1; if (fl) { while (!st.empty()) { printf("%d ", st.top()); st.pop(); } printf("\n"); exit(0); } //random_shuffle(adj[u].begin(), adj[u].end()); for (int i: adj[u]) { int v = U[i]^V[i]^u; if (ap[i] || v == p || mrk[i]) continue; solve(v, root, d+1, u); mrk[i] = 1; } disc[u] = 0; inSt[u] = 0; st.pop(); } //int deg[MAXN]; int main() { srand(time(0)); int n, m; scanf("%d %d", &n, &m); for (int i = 1; i <= m; i++) { scanf("%d %d", U+i, V+i); adj[U[i]].pb(i); adj[V[i]].pb(i); //deg[U[i]]++, deg[V[i]]++; } //for (int i= 1; i <= n; i++) // if (deg[i] > 70) // cerr << i << " " << deg[i] << "\n"; for (int i = 1; i <= n; i++) if (!disc[i]) dfs(i); //for (int i = 1; i <= m; i++) // cerr << "edge " << U[i] << " " << V[i] << " stat: " << ap[i] << "\n"; for (int i = 1; i <= n; i++) { mem(disc, 0); mem(inSt, 0); mem(mrk, 0); //cerr << "check root: " << i << "\n"; solve(i, i); while (!st.empty()) st.pop(); //cerr << "\n"; } printf("no\n"); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

indcyc.cpp: In function 'int main()':
indcyc.cpp:104:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~~
indcyc.cpp:106:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", U+i, V+i);
   ~~~~~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...