Submission #1235691

#TimeUsernameProblemLanguageResultExecution timeMemory
1235691jundiMonthly railway pass (LMIO18_menesinis_bilietas)C++20
100 / 100
576 ms49920 KiB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second

class DisjointSet{
    vector<int> rank,parent;
public:
    DisjointSet(int n){ 
        rank.resize(n+1,0);
        parent.resize(n+1);
        for(int i=0;i<n;i++){
            parent[i]=i;
        }
    }
    int findUPar(int node){  
        if(node== parent[node]) return node;
        else return parent[node]=findUPar(parent[node]);
    }
    void unionByRank(int u,int v){
        int pu=findUPar(u);
        int pv=findUPar(v);
        if(pu==pv) return;
        if(rank[pu]<rank[pv]){
            parent[pu]=pv;
        }
        else if(rank[pu]>rank[pv]){
            parent[pv]=pu;
        }
        else{
            parent[pv]=pu;
            rank[pu]++;
        }
    }
};

int main() {
    int n,m;
    cin>>n>>m;
    DisjointSet ds(n);
    vector<pair<int, int>> p(m);
    vector<char> t(m);
    for (int i=0;i<m;i++){
        cin>>p[i].fi>>p[i].se>>t[i];
        p[i].fi--; p[i].se--;
        if(t[i]=='T') ds.unionByRank(p[i].fi,p[i].se);
    }

    vector<int> reindex(n,-1); //T组合数
    map<int,int> remap;
    int cnt=0;
    for (int i=0;i<n;i++) {
        int r=ds.findUPar(i);
        if (remap.find(r)==remap.end()){ 
            remap[r]=cnt;
            cnt++;
        }
        reindex[i]=remap[r];
    }
    // for(int i=0;i<n;i++){
    //     cout<<reindex[i]<<" "<<remap[i]<<" "<<remap[ds.findUPar(i)]<<endl;
    // }

    vector<int> resize(cnt, 0); //T组合大小
    for (int i=0;i<n;i++) {
        resize[reindex[i]]++;
    }
    // for(int i=0;i<cnt;i++){
    //     cout<<resize[i]<<" ";
    // }

    set<pair<int,int>> connect; //不同T组合之间用A连接的方法
    for (int i=0;i<m;i++) {
        if (t[i]!='A') continue;
        int a=reindex[p[i].fi];
        int b=reindex[p[i].se];
        if (a==b) continue; //已经在一组
        if (a>b) swap(a,b);
        // cout<<a<<" "<<b<<endl;
        connect.insert({a,b});
    }

    vector<int> d(cnt,0); //从其他组合到这个组合的方法数
    for (auto i:connect) {
        d[i.fi]++; d[i.se]++;
    }
    // cout<<endl;
    // for(int i=0;i<cnt;i++){
    //     cout<<i<<" "<<d[i]<<endl;
    // }

    long long ans=0;
    for (int i=0;i<cnt;i++) {
        if (d[i]==cnt-1) {
            ans+=resize[i];
        }
    }
    cout<<ans;
}
#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...