Submission #1215311

#TimeUsernameProblemLanguageResultExecution timeMemory
1215311juanmartinez111Monthly railway pass (LMIO18_menesinis_bilietas)C++20
100 / 100
740 ms120968 KiB
#include<bits/stdc++.h>
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(), a.rend()
#define forn(u,n) for(int u=0;u<n;++u)
#define forns(u,i,n) for(int u=i;u<n;++u)
#define todo0(a) memset(a,0,sizeof a)
#define todom1(a) memset(a,-1,sizeof a)
#define reverso int, vector<int>, greater<int>
#define sz(a) ((int)a.size())
#define pb push_back
#define snd second
#define fst first

using namespace std;

typedef long long ll;

const long long  MOD = 1000567999;
const int N = 500001;

int parent[N];
int rank_dsu[N];

// Finds representative of DSU
int find_parent(int v) {
  return parent[v] = (v == parent[v] ? v : find_parent(parent[v]));
}

void make_set(int v){
  parent[v] = v;
  rank_dsu[v] = 1;
}

void join(int u, int  v){
  u = find_parent(u);
  v = find_parent(v);
  if (u != v){
    // Add tree of lower rank_dsued node to the higher one
    if (rank_dsu[v] > rank_dsu[u])
      swap(u, v);

    parent[v] = u;
    rank_dsu[u]+=rank_dsu[v];
  }
}
int main(){
    #ifdef LOCAL
    freopen("entra.in","r",stdin);
    #endif
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    int n,m;
    cin>>n>>m;
    vector<pair<int,int>>buses;
    forns(i,1,n+1){
        make_set(i);
    }
    forn(i,m){
        int u,v;
        string s;
        cin>>u>>v>>s;
        if(s=="T"){
            join(u,v);
        }
        else{
            buses.pb({u,v});
        }
    }
    set<int>sets;
    for(int i=1;i<=n;i++)sets.insert(find_parent(i));
    int cnt=(int)sets.size();
    ll ans=0;
    map<int,set<int>>groups;
    for(auto [u,v]:buses){
        u=find_parent(u);
        v=find_parent(v);
        if(u==v)continue;
        groups[u].insert(v);
        groups[v].insert(u);
    }
    set<int>taken;
    forns(i,1,n+1){
        int u=find_parent(i);
        if(taken.count(u))continue;
        if(1+(int)groups[u].size()==cnt)ans+=rank_dsu[u];
        taken.insert(u);
    }
    cout<<ans<<endl;
}

#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...