//图的搜索遍历 //“We assume that there is only one job processing in one moment”即一次只能处理1个任务,不能同时处理 //因此不是关键路径中的求最早启动时间,害我WA了N次! //只要记录父亲指针,不断递归加上所有父亲他们所要花的时间就好了 //G++中time是关键字来的,不要随便申请time这个名字的变量…… //读取数据是个麻烦的环节 #include<iostream> #include<string> #include<vector> #include<cstring> using namespace std; int Time[10005]; bool vis[10005]; vector<int> v; vector<int> fa[10005]; int n,m; void getNum(string str) { int num = 0; v.clear(); for(int i = 0;i < str.size();++i) { if(str[i] == ' ' ) { v.push_back(num); num = 0; continue; } else { num = num * 10 + str[i] - '0'; if(i == str.size() - 1) v.push_back(num); } } } int solve(int x) { vis[x] = 1; int ans = 0; ans += Time[x]; for(int i = 0;i < fa[x].size();++i) { if(vis[fa[x][i]]) continue; ans += solve(fa[x][i]); } return ans; } int main() { string str; //freopen("in.txt","r",stdin); while(getline(cin,str)) { memset(vis,0,sizeof(vis)); memset(fa,0,sizeof(fa)); memset(Time,0,sizeof(Time)); getNum(str); n = v[0]; if(n == 0) break; m = v[1]; for(int i = 1;i <= n;++i) { getline(cin,str); getNum(str); Time[i] = v[0]; for(int j = 1;j < v.size();++j) { fa[i].push_back(v[j]); } } printf("%d/n",solve(m)); } return 0; }