제출 #1140582

#제출 시각아이디문제언어결과실행 시간메모리
114058212345678Monthly railway pass (LMIO18_menesinis_bilietas)C++20
100 / 100
333 ms83116 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=5e5+5;

int n, m, sz[nx], g[nx], vs[nx], u, v, cnt, dp[nx], mx, res;
char t;
vector<int> d[nx];
vector<pair<int, int>> edg;
set<int> s[nx];

void dfs(int u, int hd)
{
    vs[u]=1;
    g[u]=hd;
    sz[hd]++;
    for (auto v:d[u]) if (!vs[v]) dfs(v, hd);
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>m;
    for (int i=1; i<=m; i++)
    {
        cin>>u>>v>>t;
        if (t=='T') d[u].push_back(v), d[v].push_back(u);
        else edg.push_back({u, v});
    }
    for (int i=1; i<=n; i++) if (!vs[i]) dfs(i, ++cnt);
    for (auto [u, v]:edg) if (g[u]!=g[v]) s[g[u]].insert(g[v]), s[g[v]].insert(g[u]);
    for (int i=1; i<=cnt; i++) 
    {
        dp[i]=sz[i];
        for (auto v:s[i]) dp[i]+=sz[v]; 
    }
    //for (int i=1; i<=n; i++) cout<<"g "<<i<<' '<<g[i]<<'\n';
    //for (int i=1; i<=cnt; i++) cout<<i<<' '<<sz[i]<<' '<<dp[i]<<'\n';
    for (int i=1; i<=cnt; i++) if (dp[i]==n) res+=sz[i];
    cout<<res;
}
#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...