//-------------------------------------------------- #include <iostream> #include <string> #define SAFEDELETE_ARRAY(p) / { if(p) {delete []p; p=NULL; } } using namespace std; //------------- typedef struct ufset { string name; int age; int parent; int flag; }ufset,*UFSet; int compare(const void *p1,const void *p2) { ufset u1=*(ufset *)p1; ufset u2=*(ufset *)p2; if(u1.age<u2.age) return 1; else if(u1.age==u2.age && u1.name >u2.name) return 1; else return 0; } int refer(UFSet U,string s,int size) { for(int i=0;i<=size-1;i++) if(U[i].name==s) return i; return -1; } void Union(UFSet U,string s1,string s2,int size) { int i=refer(U,s1,size); int j=refer(U,s2,size); U[j].parent=i; } void ComputeAge(UFSet U,int i) { if(U[i].flag==1) return; if(U[i].name=="Ted") { U[i].flag=1; U[i].age=100; return; } ComputeAge(U,U[i].parent); U[i].age=U[U[i].parent].age-U[i].age; U[i].flag=1; } void deal(UFSet U,int count) { for(int i=0;i<count;i++) if(!U[i].flag) ComputeAge(U,i); } void print(UFSet U,int count,int t) { cout << "DATASET " << t << endl; for(int i=1;i<count;i++) cout << U[i].name << " " << U[i].age << endl; } UFSet Init(int t) { int X; cin >> X; UFSet U=new ufset[2*X]; for(int i=0;i<2*X;i++) { U[i].parent=0; U[i].flag=0; } int i=0; string s1,s2; int age; for(int j=0;j<X;j++) { cin >> s1 >> s2 >> age; if(refer(U,s1,i)==-1) U[i++].name=s1; if(refer(U,s2,i)==-1) { U[i].age=age; U[i++].name=s2; } else U[refer(U,s2,i)].age=age; Union(U,s1,s2,i); } int count=i; deal(U,count); qsort(U,count,sizeof(ufset),compare); print(U,count,t); return U; } int main() { int n; cin >> n; for(int i=1;i<=n;i++) { UFSet U=Init(i); SAFEDELETE_ARRAY(U); } getchar(); getchar(); return 0; } //所用知识:1 并查集的变形 // 2 树的深度优先搜索