#include <iostream>
#include <vector>
#include <queue>
#pragma gcc optimize("O4,Ofast")
#pragma gcc optimize("unroll-loops")
using namespace std;
const int Nmax = 5e5 + 5;
vector<int>g[Nmax];
bool mor[Nmax], vis[Nmax];
int parent[Nmax], sz[Nmax], comp[Nmax], par[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;
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[a].push_back(b);
g[b].push_back(a);
}
}
for(i = 1; i <= n; i ++)
par[findd(i)] = 1;
for(i = 1; i <= n; i ++)
{
int parinte = findd(i);
if(vis[parinte]) continue;
int cnt = 0;
for(auto it: g[i])
mor[findd(it)] = 1;
//cout << i << ": ";
for(int j = 1; j <= n; j ++)
if(mor[j])
cnt += sz[j], mor[j] = 0;
// cout << '\n';
if(cnt + sz[parinte] == n)
ans += sz[parinte], vis[parinte] = 1;
//cout << i << " " << parinte << " " << sz[parinte] << " " << cnt << '\n';
}
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... |