Submission #1306343

#TimeUsernameProblemLanguageResultExecution timeMemory
1306343SofiatpcMonthly railway pass (LMIO18_menesinis_bilietas)C++20
16 / 100
455 ms69772 KiB
#include <bits/stdc++.h>

using namespace std;

#define sz(v) (int)v.size()
const int MAXN = 5*1e5+5;
int p[MAXN], s[MAXN], marc[MAXN];
set<int> adj[MAXN];

int find(int x){
    if(p[x] == x)return x;
    return p[x] = find(p[x]);
}

void merge(int a, int b){
    a = find(a), b = find(b);

    if(a == b)return;

    if(s[a] < s[b])swap(a,b);

    s[a] += s[b];
    p[b] = a; 
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n,m; cin>>n>>m;

    for(int i = 1; i <= n; i++){
        p[i] = i; s[i] = 1;
    }

    vector<int> va,vb;
    for(int i = 1; i <= m; i++){
        int a,b; char c; cin>>a>>b>>c;
        if(c == 'T') merge(a,b);
        else { va.push_back(a); vb.push_back(b); }
    }

    for(int i = 0; i < sz(va); i++){
        adj[ find(va[i]) ].insert( find(vb[i]) );
        adj[ find(vb[i]) ].insert( find(va[i]) );
    }

    int ans = 0;
    for(int i = 1; i <= n; i++){
        if(marc[ find(i) ] == 0){
            int qtd = s[find(i)];
            for(int viz : adj[ find(i) ])qtd += s[viz];
            if(qtd == n)marc[ find(i) ] = 1;
            else marc[ find(i) ] = 2;
        }

        if(marc[find(i)] == 1)ans++;
    }
    cout<<ans<<"\n";
}
#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...