Submission #1140936

#TimeUsernameProblemLanguageResultExecution timeMemory
1140936adelinaMonthly railway pass (LMIO18_menesinis_bilietas)C++20
100 / 100
665 ms70192 KiB
#include <iostream>
#include <vector>
#include <set>
using namespace std;

const int Nmax = 5e5 + 5;

vector<pair<int, int>>g;
set<int>plang[Nmax];
bool used[Nmax];
int parent[Nmax], sz[Nmax], comp[Nmax];

int findd(int nod)
{
    if(nod == parent[nod])
        return nod;
    return parent[nod] = findd(parent[nod]);
}

void unite(int u, int v)
{
    u = findd(u); v = findd(v);
    if(u == v) return;
    if(sz[v] > sz[u])
        swap(u, v);
    parent[v] = u;
    sz[u] += sz[v];
    sz[v] = 0;
}

int main()
{
    int n, m, a, b, i, c, ans = 0, p = 0, nrc = 0;
    char ch;
    cin >> n >> m;
    for(i = 1; i <= n; i ++)
        parent[i] = i, sz[i] = 1;
    for(i = 1; i <= m ; i ++)
    {
        cin >> a >> b >> ch;
        if(ch == 'T')
            unite(a, b);
        else
            g.push_back({a, b});
    }
    for(i = 1; i <= n; i ++)
        comp[i] = findd(i), used[comp[i]] = 1;
    for(i = 1; i <= n; i ++)
        if(used[i])
            nrc ++;
    for(auto [a, b]: g)
    {
        if(comp[a] != comp[b])
            plang[comp[a]].insert(comp[b]), plang[comp[b]].insert(comp[a]);
    }
    for(i = 1; i <= n; i ++)
         if(used[i] && plang[i].size() == nrc - 1)
            ans += sz[i];
    cout << ans;
    return 0;
}
#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...