拓扑一下即可。。。
#include <iostream>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cmath>
#include <time.h>
#define maxn 10005
#define maxm 1000005
#define eps 1e-10
#define mod 1000000007
#define INF 999999999
#define lowbit(x) (x&(-x))
#define mp make_pair
#define ls o<<1
#define rs o<<1 | 1
#define lson o<<1, L, mid
#define rson o<<1 | 1, mid+1, R
#pragma comment(linker, "/STACK:16777216")
typedef long long LL;
typedef unsigned long long ULL;
//typedef int LL;
using namespace std;
LL qpow(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base;base=base*base;b/=2;}return res;}
LL powmod(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base%mod;base=base*base%mod;b/=2;}return res;}
void scanf(int &__x){__x=0;char __ch=getchar();while(__ch==' '||__ch=='\n')__ch=getchar();while(__ch>='0'&&__ch<='9')__x=__x*10+__ch-'0',__ch = getchar();}
LL gcd(LL _a, LL _b){if(!_b) return _a;else return gcd(_b, _a%_b);}
// head
char s[1000005];
string ss;
int w[maxn];
map<string, int> mpp;
struct Edge
{
int v;
Edge *next;
}pool[maxm], *H[maxn], *edges;
queue<int> q;
int in[maxn], dp[maxn];
int n, t;
void addedges(int u, int v)
{
edges->v = v;
edges->next = H[u];
H[u] = edges++;
}
void init(void)
{
edges = pool;
mpp.clear();
memset(H, 0, sizeof H);
memset(w, 0, sizeof w);
memset(in, 0, sizeof in);
memset(dp, 0, sizeof dp);
}
void read(void)
{
int cnt = 0, now, head;
t = 0;
//printf("AAAA\n");
while(gets(s) != NULL) {
int len = strlen(s);
if(len == 0) break;
ss.clear();
int j = 0;
for(int i = 0; i < len; i++) {
if(s[i] == ' ') {
if(mpp.count(ss)) now = mpp[ss];
else now = mpp[ss] = ++t;
addedges(now, head);
// printf("AA %d %d\n", now, head);
in[head]++;
j = 0;
ss.clear();
}
else if(s[i] == '*') {
if(mpp.count(ss)) now = mpp[ss];
else now = mpp[ss] = ++t;
head = now;
w[head] = 1;
i += 2;
j = 0;
ss.clear();
}
else if(s[i] == ':') {
if(mpp.count(ss)) now = mpp[ss];
else now = mpp[ss] = ++t;
head = now;
w[head] = 0;
i++;
j = 0;
ss.clear();
}
else ss += s[i];
}
int tt = ss.length();
if(tt) {
if(mpp.count(ss)) now = mpp[ss];
else now = mpp[ss] = ++t;
//printf("AAA %d %d\n", now, head);
addedges(now, head);
in[head]++;
// printf("AA %d %d\n", now, head);
}
}
//printf("AAA %d\n", t);
//printf("BBBBB\n");
}
void work(void)
{
int mx = 0, now;
for(int i = 1; i <= t; i++) if(!in[i]) q.push(i), dp[i] = w[i];
//for(int i = 1; i <= t; i++) printf("AAA %d %d\n", i, w[i]);
while(!q.empty()) {
now = q.front(), q.pop();
mx = max(mx, dp[now]);
// printf("AAA %d BB\n", now);
for(Edge *e = H[now]; e; e = e->next) {
dp[e->v] = max(dp[e->v], dp[now] + w[e->v]);
in[e->v]--;
if(!in[e->v]) q.push(e->v);
}
}
printf("%d\n", mx);
}
int main(void)
{
int _, __ = 0;
while(scanf("%d", &_)!=EOF) {
getchar();
getchar();
// printf("BBBBFDAFDSAFASF\n");
while(_--) {
init();
read();
printf("Case %d: ", ++__);
work();
}
}
return 0;
}