structEdge { int u, v, sf; Edge(int u, int v, int w): u(u), v(v), sf(w) {}; friendbooloperator == (Edge A, Edge B) { return A.u == B.u && A.v == B.v; } };
vector<Edge> G[maxN];
int N, E;
int cnt;
deque<Edge> Q;
voiddfs(int k, int fa, int dep){ while (dep < int(Q.size()) << 1) { Q.pop_front(); cnt++; } for (auto i : G[k]) { if (i.v == fa) continue; if (i.sf == 1) Q.push_back(i); dfs(i.v, k, dep + 1); if(!Q.empty() && Q.back() == i) Q.pop_back(); } }
scanf("%d%d", &N, &E); for (int i = 1; i < N; i++) { int u, v; scanf("%d%d", &u, &v); scanf("%s", S); int us = S[0] == 'u'; G[u].push_back(Edge(u, v, us)); G[v].push_back(Edge(v, u, us)); } dfs(1, 0, 0);
int waitingNum[maxL];//四个方向等待车数 int nextNum[maxL];//四个方向来车后的等待车数 int nextNextNum[maxL];//四个方向来车后走了一辆的等待车数
intmain(){ freopen("traffic.in","r",stdin); freopen("traffic.out","w",stdout); scanf("%d%d",&N,&L); for(int i = 1;i<=N;i++){ getchar(); int T; char X; scanf("%c%d",&X,&T); C[i] = Car(X,T); } sort(C+1,C+1+N);
memset(dp,0x7f,sizeof(dp)); dp[0][0][0][0][0] = 0; int p = 1; for(int t = 1;t<=60;t++){ memset(waitingNum,0,sizeof(waitingNum)); while(C[p].t == t){ waitingNum[C[p].from]++; p++; } for(int i = 0;i<=L;i++) for(int j = 0;j<=L;j++) for(int k = 0;k<=L;k++) for(int l = 0;l<=L;l++){ if(dp[t-1][i][j][k][l] == INF) continue; int Tt[] = {0,i,j,k,l}; for(int r = 1;r<=4;r++){ nextNum[r] = Tt[r] + waitingNum[r]; nextNextNum[r] = max(nextNum[r]-1,0); } if(openNS){ int a = nextNextNum[1]; int b = nextNextNum[2]; int c = nextNum[3]; int d = nextNum[4]; dp[t][a][b][c][d] = min(dp[t][a][b][c][d],dp[t-1][i][j][k][l]+a+b+c+d); } if(openWE){ int a = nextNum[1]; int b = nextNum[2]; int c = nextNextNum[3]; int d = nextNextNum[4]; dp[t][a][b][c][d] = min(dp[t][a][b][c][d],dp[t-1][i][j][k][l]+a+b+c+d); } } } int mi = INF; for(int i = 0;i<=L;i++) for(int j = 0;j<=L;j++) for(int k = 0;k<=L;k++) for(int l = 0;l<=L;l++){ mi = min(mi,dp[60][i][j][k][l]); } if(mi == INF) printf("No solution"); elseprintf("%d",mi); return0; }