Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*#pragma GCC optimize("Ofast")
- #pragma GCC optimize("unroll-loops")*/
- // only when really needed
- /* GNU G++17 7.3.0: No long long for faster code
- GNU G++17 9.2.0 (64 bit, msys 2): Long long only for faster code */
- #include <bits/stdc++.h>
- #define for1(i,a,b) for (int i = a; i <= b; i++)
- #define for2(i,a,b) for (int i = a; i >= b; i--)
- #define int long long
- #define sz(a) (int)a.size()
- #define pii pair<int,int>
- /*
- __builtin_popcountll(x) : Number of 1-bit
- __builtin_ctzll(x) : Number of trailing 0
- */
- #define PI 3.1415926535897932384626433832795
- #define INF 1000000000000000000
- #define MOD 1000000007
- #define MOD2 1000000009
- #define EPS 1e-6
- using namespace std;
- struct edge{
- int u, v, sum, cnt;
- bool operator< (const edge& other) {
- if (cnt != other.cnt) return cnt < other.cnt;
- return sum < other.sum;
- }
- };
- int mul[4] = {1, 5, 25, 125};
- vector<pair<int, pii>> g[32000];
- vector<edge> v;
- bool flag[32000];
- int ans, ans1, ans2, ans3, t, n, m, parent[32000], sz[32000];
- int find_set(int v) {
- return (v == parent[v] ? v : parent[v] = find_set(parent[v]));
- }
- void join_sets(int a, int b) {
- a = find_set(a);
- b = find_set(b);
- if (a != b) {
- if (sz[a] < sz[b]) swap(a, b);
- parent[b] = a;
- sz[a] += sz[b];
- }
- }
- void dfs(int u) {
- ans++;
- flag[u] = true;
- for (auto e : g[u]) {
- if (!flag[e.first] && e.second.second == 0) dfs(e.first);
- }
- }
- signed main() {
- ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
- freopen("NINJA.inp", "r", stdin);
- freopen("NINJA.out", "w", stdout);
- cin >> t >> n >> m;
- for1(i,1,n) {
- parent[i] = i;
- sz[i] = 1;
- }
- for1(i,1,m) {
- int a, b, sum = 0, cnt = 0;
- string s;
- cin >> a >> b >> s;
- for1(i,0,3) {
- if (s[i] == 'E') cnt++;
- else sum += mul[i] * (s[i] - 'A' + 1);
- }
- g[a].push_back({b, {sum, cnt}});
- g[b].push_back({a, {sum, cnt}});
- v.push_back({a, b, sum, cnt});
- }
- if (t == 1) {
- dfs(1);
- cout << ans;
- }
- else {
- sort(v.begin(), v.end());
- for (auto e : v) {
- if (find_set(e.u) != find_set(e.v)) {
- // Chi phi nho nhat
- ans1 += e.sum;
- // So luong chuong ngai vat E nho nhat
- ans2 += e.cnt;
- // So hanh lang co chua chuong ngai vat E
- if (e.cnt != 0) ans3++;
- join_sets(e.u, e.v);
- }
- }
- if (t == 2) cout << ans3 << " " << ans2;
- else cout << ans1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment