#include #include #include int Island[151], Addr[151]; char Iname[51][30], TDN[51][30]; int Dist[51]; int T1[51],Tn[501],Td[501],Tc[501]; int Gnum[51], G1[51], Gn[51][151], Gp[51][151]; int SolH[100000], SolP[100000], SolT[100000], SolI[100000]; int NH, NI, NT, S; int F[11], Q[1000]; int comp(int *xx, int *yy) { int x = *xx; int y = *yy; if (Addr[SolH[x]] < Addr[SolH[y]]) return -1; if (Addr[SolH[x]] > Addr[SolH[y]]) return 1; if (SolP[x] < SolP[y]) return -1; if (SolP[x] > SolP[y]) return 1; return 0; } int findhost(int h) { int i; for(i=1; i<=NH; i++) if (Addr[i] == h) return i; printf("Breeek %d\n", h); exit(3); } int findgrp(int g) { int i; for(i=1; i<=20; i++) if (Gnum[i] == g && G1[i]) return i; printf("Bleech %d\n", g); exit(4); } void dijk(int g, int h, int id, int ttl) { int qr, qw, i, j; int i0, t; i0 = Island[h]; for(i=1; i<=NI; i++) { F[i] = 0; Dist[i] = 10000; } Dist[i0] = 0; qr = 0; qw = 1; Q[0] = i0; while (qr < qw) { i = Q[qr++]; F[i] = 0; for(t=T1[i]; t; t=Tn[t]) { int d = Td[t]; int a = Dist[i] + Tc[t]; if (a < Dist[d]) { Dist[d] = a; if (!F[d]) { Q[qw++] = d; F[d] = 1; } } } } for(h=G1[g]; h; h=Gn[g][h]) { int i = Island[h]; if (Dist[i] <= ttl) { SolH[S] = h; SolP[S] = id; SolT[S] = ttl - Dist[i]; SolI[S] = S; S++; } } } int main( void ) { FILE *in=fopen("mbone.in", "r" ); int z, n; for( z=1; ; z++ ) { char s[10240]; int i, j, g, h, p; fscanf(in, "%d\n", &NI); if (!NI) return 0; memset(Gnum, 0, sizeof(Gnum)); memset(G1, 0, sizeof(G1)); memset(T1, 0, sizeof(T1)); memset(Tn, 0, sizeof(Tn)); NH = NT = S = 0; for(i=1; i<=NI; i++) { fscanf(in, "%s %d\n", Iname[i], &p); while (p--) { fgets(s, 256, in); switch (s[0]) { case 'H': NH++; sscanf(s+2, "%d", &Addr[NH]); Island[NH] = i; break; case 'T': NT++; sscanf(s+2, "%d %s", &Tc[NT], TDN[NT]); Tn[NT] = T1[i]; T1[i] = NT; break; default: return 1; } } } for(i=1; i<=NT; i++) for(j=1; j<=NI; j++) if (!strcmp(Iname[j], TDN[i])) { Td[i]=j; break; } fscanf(in, "%d\n", &p); while (p--) { fgets(s, 256, in); #if 0 fputs(s, stdout); #endif switch (s[0]) { case 'J': sscanf(s+2, "%d%d", &h, &g); h = findhost(h); for(i=1; i<=20; i++) if (Gnum[i] == g && G1[i]) { #if 0 printf("Add %d %d\n", i, h); #endif j = G1[i]; G1[i] = h; Gn[i][h] = j; Gp[i][h] = 0; Gp[i][j] = h; break; } if (i > 20) for(i=1; i<=20; i++) if (!G1[i]) { #if 0 printf("New %d %d\n", i, h); #endif Gnum[i] = g; G1[i] = h; Gn[i][h] = 0; Gp[i][h] = 0; break; } break; case 'L': sscanf(s+2, "%d%d", &h, &g); h = findhost(h); g = findgrp(g); #if 0 printf("Leaving %d %d\n", g, h); #endif if (i = Gp[g][h]) Gn[g][i] = Gn[g][h]; else G1[g] = Gn[g][h]; if (i = Gn[g][h]) Gp[g][i] = Gp[g][h]; break; case 'S': sscanf(s+2, "%d%d%d%d", &h, &g, &i, &j); g = findgrp(g); h = findhost(h); dijk(g, h, i, j); break; default: return 2; } } printf( "Network #%d\n", z ); qsort(SolI, S, sizeof(int), comp); for(i=0; i