#include<bits/stdc++.h> using namespace std; const int maxn=1e3; struct node { int v; char c; }; vector<node> g[maxn]; int dfn[maxn]; int dfo[maxn]; int N; int cnt; int l1[maxn]; int r1[maxn]; int l2[maxn]; int r2[maxn]; int xz[maxn]; int visit[maxn]; int vc[maxn][256][2]; int ck[maxn][256]={0}; void dfs (int u) { visit[u]=1; dfn[u]=++cnt; for (int i=0;i<g[u].size();i++) if (!visit[g[u][i].v]) dfs(g[u][i].v); dfo[u]=cnt; } int main () { int T; int u,v; char c; scanf("%d",&T); while (T--) { scanf("%d",&N); memset(l1,0,sizeof(l1)); memset(xz,0,sizeof(xz)); memset(visit,0,sizeof(visit)); memset(ck,0,sizeof(ck)); for (int i=1;i<=N;i++) g[i].clear(); for (int i=1;i<=N-1;i++) { scanf("%d %d %c",&u,&v,&c); g[u].push_back({v,c}); g[v].push_back({u,c}); vc[u][c][ck[u][c]++]=v; vc[v][c][ck[v][c]++]=u; } cnt=0; dfs(1); int flag=0; for (int i=1;i<=N;i++) { int cnt[256]={0}; for (int j=0;j<g[i].size();j++) cnt[g[i][j].c]++; int f1=0; for (int j=0;j<256;j++) { if (cnt[j]==2) f1++; if (cnt[j]>2) { flag=1;break; } } if (flag==1) break; if (f1>1) { flag==1;break; } } if (flag) { printf("0\n");continue; } for (int i=1;i<=N;i++) { //int vc[256][2]; //int ck[256]={0}; //for (int j=0;j<g[i].size();j++) //vc[g[i][j].c][ck[g[i][j].c]++]=g[i][j].v; for (int j=0;j<256;j++) { if (ck[i][j]<2) continue; int t1=vc[i][j][0]; int t2=vc[i][j][1]; if (dfn[t1]>dfn[t2]) swap(t1,t2); if (dfn[i]>dfn[t1]) { l1[i]=1;r1[i]=dfn[t1]; l2[i]=dfn[t2];r2[i]=dfo[t2]; } else { l1[i]=dfn[t1]; r1[i]=dfo[t1]; l2[i]=dfn[t2]; r2[i]=dfo[t2]; } break; } } int ccc=0; for (int i=1;i<=N;i++) { if (!l1[i]) { ccc++; continue; } for (int j=l1[i];j<=r1[i];j++) xz[j]++; for (int j=l2[i];j<=r2[i];j++) xz[j]++; } int root=0; for (int i=1;i<=N;i++) if (xz[i]==N-ccc) root++; printf("%d\n",root); } }
字典树攻关代码
猜你喜欢
转载自www.cnblogs.com/zhanglichen/p/12435706.html
今日推荐
周排行