题意:给定了一个有向图。然后给了一系列的操作,这些操作是去图中的某些点,并且保留这些点之间的边,构成个新图,然后找这个图中入度为0,初读为所有点个数的点。
做法:唉,过了很久才发现这样的点最多一个,细想啊。。。还有VC6.0真是可恶的东西...
#pragma warning(disable:4786) #include<cstdio> #include<cstring> #include<string> #include<utility> #include<algorithm> #include<map> #include<vector> using namespace std; const int LMT=60002; vector<int>gra[LMT]; map<string,int>nm; vector<int>par; string nm2[LMT]; int ans,cnt; //只有一个KING啊!!!! void init(void) { par.clear(); } int main() { int i,j,T,n,m,q,num,u,v; char na[25]; string name; scanf("%d",&T); while(T--) { nm.clear();cnt=0; for(i=0;i<LMT;i++)gra[i].clear(); scanf("%d%d%d",&n,&m,&q); for(i=0;i<n;i++) { scanf("%s",na); name=string(na); if(nm.find(name)==nm.end()) { nm.insert(make_pair(name,cnt)); nm2[cnt]=name; cnt++; } u=nm[name]; scanf("%d",&num); for(j=0;j<num;j++) { scanf("%s",na); name=string(na); if(nm.find(name)==nm.end()) { nm.insert(make_pair(name,cnt)); nm2[cnt]=name; cnt++; } v=nm[name]; gra[u].push_back(v); } sort(gra[u].begin(),gra[u].end()); } for(i=0;i<m;i++) { scanf("%s",na); name=string(na); if(nm.find(name)==nm.end()) { nm.insert(make_pair(name,cnt)); nm2[cnt]=name; cnt++; } u=nm[name]; scanf("%d",&num); for(j=0;j<num;j++) { scanf("%s",na); name=string(na); if(nm.find(name)==nm.end()) { nm.insert(make_pair(name,cnt)); nm2[cnt]=name; cnt++; } v=nm[name]; gra[u].push_back(v); } sort(gra[u].begin(),gra[u].end()); } while(q--) { init(); scanf("%d",&num); while(num--) { scanf("%s",na); name=string(na); par.push_back(nm[name]); } for(i=0;i<(int)par.size();i++) { for(j=0;j<(int)par.size();j++) { if(i==j)continue; if(!binary_search(gra[par[i]].begin(),gra[par[i]].end(),par[j]) ||binary_search(gra[par[j]].begin(),gra[par[j]].end(),par[i])) break; } if(j==(int)par.size()) { printf("1 %s\n",nm2[par[i]].c_str()); break; } } if(i==(int)par.size())puts("0"); } printf("\n"); } return 0; }