提交时间:2025-05-02 15:02:52
运行 ID: 37714
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=4e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,m,c[maxn]; int bel[maxn]; int hd[maxn],to[maxn],nxt[maxn],ct=1,tot; struct node { int x,y,c; }d[maxn]; void link(int x,int y){ ++ct;nxt[ct]=hd[x],hd[x]=ct,to[ct]=y; ++ct;nxt[ct]=hd[y],hd[y]=ct,to[ct]=x; } int fa[maxn],fe[maxn]; int vis[maxn],cnt,dep[maxn]; void dfs(int u){ dep[u]=dep[fa[u]]+1,vis[u]=1; for(int i=hd[u];i;i=nxt[i]){ if(to[i]==fa[u])continue; if(!vis[to[i]])fa[to[i]]=u,fe[to[i]]=i>>1,dfs(to[i]); else if(!bel[i>>1])bel[i>>1]=++tot; } } struct dsu { int fa[maxn]; int fd(int u){if(u==fa[u])return u;return fa[u]=fd(fa[u]);} bool mg(int x,int y){x=fd(x),y=fd(y);if(x==y)return 0;fa[y]=x;return 1;} }T; bool tag[maxn]; bool ok[maxn]; vector<int>ve[maxn]; void slv(){ n=read(),m=read(); map<int,int>mp;int s=0; up(i,1,m){ int x=read(),y=read(),col=read(); if(!mp.count(col))mp[col]=++s;col=mp[col]; d[i].x=x,d[i].y=y,d[i].c=col; link(x,y); } up(i,1,n)if(!vis[i])dfs(i); vector<int>G; up(i,1,m)if(bel[i])G.p_b(i); for(int u:G){ int x=d[u].x,y=d[u].y; while(x!=y){ if(dep[x]>=dep[y])bel[fe[x]]=bel[u],x=fa[x]; else bel[fe[y]]=bel[u],y=fa[y]; } } up(i,1,m)if(bel[i])ve[bel[i]].p_b(d[i].c); up(i,1,s){ set<int>s; for(int x:ve[i])s.insert(x); if(s.size()!=ve[i].size())for(int p:s)tag[p]=1; } up(i,1,s)ve[i].clear(); up(i,1,G.size()+s)T.fa[i]=i; up(i,1,m)if(bel[i])ve[d[i].c].p_b(bel[i]); up(i,1,s)for(int x:ve[i]){ if(!T.mg(i+G.size(),x))tag[i]=1; } up(i,1,m)if(!bel[i])tag[d[i].c]=1; up(i,G.size()+1,G.size()+s)ok[T.fd(i)]|=tag[i-G.size()]; int res=s; up(i,G.size()+1,G.size()+s)if(T.fd(i)==i)res-=!ok[i]; cout<<res; } int main(){ //freopen("b.in","r",stdin),freopen("b.out","w",stdout); slv(); fclose(stdin),fclose(stdout); return 0; }