#include<iostream>
#include<vector>
#include<set>
#include<bitset>
//#include<cassert>
const int NMAX=500005;
struct bus_edge{
int from, to;
};
std::vector<int>t(NMAX), cnt(NMAX, 1);
std::vector<bus_edge>rem;
std::bitset<NMAX>f;
std::set<int>S[NMAX];
int n, m, nr_cc, ans=0;
inline int root(int x)
{
if(!t[x])
return x;
t[x]=root(t[x]);
return t[x];
}
inline void unite(int x, int y)
{
int rx=root(x), ry=root(y);
if(rx==ry)
return;
--nr_cc;
if(cnt[rx]>cnt[ry])
{
cnt[rx]+=cnt[ry];
t[ry]=rx;
return;
}
cnt[ry]+=cnt[rx];
t[rx]=ry;
}
void read()
{
std::cin>>n>>m;
nr_cc=n;
for(int i=0; i<m; ++i)
{
int from, to;
char type;
std::cin>>from>>to>>type;
if(type=='T')
unite(from, to);
else if(type=='A')
rem.push_back({from, to});
}
}
void solve()
{
for(auto it:rem)
{
int rFrom=root(it.from);
int rTo=root(it.to);
if(rFrom!=rTo)
{
S[rFrom].insert(rTo);
S[rTo].insert(rFrom);
}
}
for(int i=1; i<=n; ++i)
{
int r=root(i);
if(!f[r])
{
if(S[r].size()==nr_cc-1)
ans+=cnt[r];
f[r]=true;
}
}
std::cout<<ans;
}
int main()
{
std::ios_base::sync_with_stdio(false);
read();
solve();
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... |