제출 #230544

#제출 시각아이디문제언어결과실행 시간메모리
230544VimmerPraktični (COCI18_prakticni)C++14
0 / 130
102 ms12308 KiB
#include <bits/stdc++.h> //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> //#pragma GCC optimize("unroll-loops") //#pragma GCC optimize("-O3") //#pragma GCC optimize("Ofast") //#pragma GCC optimize("fast-math") //#pragma GCC optimize("no-stack-protector") #define F first #define S second #define sz(x) int(x.size()) #define pb push_back #define N 100005 #define MOD ll(998244353) using namespace std; //using namespace __gnu_pbds; typedef long double ld; typedef long long ll; typedef short int si; //typedef tree <int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; vector <pair <int, int> > g[N]; bool mk[N], mkr[N], fnd; int in[N], f[N], id, t, p[N]; vector <vector <int> > vr; vector <pair <int, int> > path; int idr[N]; void dfs(int v, int p) { f[v] = in[v] = ++id; mk[v] = 1; for (auto it : g[v]) { if (it.S == p) continue; if (!mk[it.S]) {dfs(it.S, v); f[v] = min(f[v], f[it.S]); if (f[it.S] > in[v]) mkr[it.F] = 1;} else f[v] = min(f[v], f[it.S]); } } void rec(int v) { mk[v] = 1; vr.back().pb(v); idr[v] = sz(vr); for (auto it : g[v]) { if (mk[it.S] || mkr[it.F]) continue; rec(it.S); } } void dfser(int v, int pr) { mk[v] = 1; if (fnd) return; for (auto it : g[v]) { if (fnd) break; if (it.S == pr) continue; if (mk[it.S]) { t = p[it.F]; fnd = 1; while (sz(path) > 0 && path.back().S != it.S) { t ^= p[path.back().F]; path.pop_back(); } } path.pb({it.F, it.S}); dfser(it.S, v); path.pop_back(); } mk[v] = 0; } int main() { // freopen("input.txt", "r", stdin);// freopen("output.txt", "w", stdout); ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m; cin >> n >> m; for (int i = 0; i < m; i++) { int x, y, t; cin >> x >> y >> t; g[x].pb({i + 1, y}); g[y].pb({i + 1, x}); p[i + 1] = t; } dfs(1, -1); memset(mk, 0, sizeof(mk)); for (int i = 1; i <= n; i++) { if (mk[i]) continue; vr.emplace_back(); rec(i); } vector <int> ans; ans.clear(); for (int i = 0; i < sz(vr); i++) { if (sz(vr[i]) < 3) continue; for (auto it : g[vr[i][0]]) { if (mkr[it.F] || idr[it.S] != i + 1) continue; ans.pb(it.F); break; } if (!fnd) { memset(mk, 0, sizeof(mk)); dfser(vr[i][0], -1); } } if (sz(ans) == 0) {cout << 0 << endl; exit(0);} cout << 1 << endl; cout << t << " " << sz(ans) << " "; for (auto it : ans) cout << it << " "; }
#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...