#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |