2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) E
链接:http://codeforces.com/gym/101116
学弟写的,以后再补
#include <iostream> #include <algorithm> #include <stdio.h> #include <cstring> #include <map> #include <vector> using namespace std; map<string,int>v,ans; vector<int>que[40020]; string b[40020]; int pre[40020],vis[40020],a[40020],c[40020],d[40020]; void dfs(int x){ if(c[x]==1) ans[b[x]]=1; vis[x]=1; for(int i=0;i<que[x].size();i++){ int y=que[x][i]; if(!vis[y]){ dfs(y); } } } int main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); int T,n,m,k,cnt,p; cin>>T; string s,s1; while(T--){ memset(vis,0,sizeof(vis)); memset(c,0,sizeof(c)); cnt=0,p=1; cin>>n>>m>>k; for(int i=0;i<n;i++){ cin>>s; if(!v[s]){ b[p]=s; v[s]=p++; } d[i]=v[s]; } for(int i=0;i<m;i++){ cin>>s; if(!v[s]){ b[p]=s; v[s]=p++; } c[v[s]]=1; } while(k--){ cin>>s>>s1; if(!v[s]) { b[p]=s; v[s]=p++; } if(!v[s1]) { b[p]=s1; v[s1]=p++; } que[v[s]].push_back(v[s1]); } for(int i=0;i<n;i++){ if(!vis[d[i]]){ dfs(d[i]); } } int f=1; for(auto it : ans){ if(f) f=0,cout<<(it.first); else cout<<" "<<(it.first); } if(!f) cout<<endl; v.clear(),ans.clear(); for(int i=0;i<40020;i++) que[i].clear(); } }