uva 12648
一个简单的搜索;
反正树的结构不会变,只需要把节点的名称换一下就行;
可惜比赛的时候思路不清晰;
1 #include<cstdio> 2 #define maxn 5050 3 #include<vector> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 int age[maxn]; 8 int biao[maxn]; 9 bool vis[maxn]; 10 vector<int>ve[maxn],pa[maxn]; 11 char s[10]; 12 int ans; 13 void dfs(int x,int v) 14 { 15 vis[x]=1; 16 pa[v].push_back(x); 17 int l=ve[x].size(); 18 for(int i=0;i<l;i++) 19 { 20 if(vis[ve[x][i]])continue; 21 dfs(ve[x][i],v); 22 } 23 } 24 25 int main() 26 { 27 // freopen("data.in","r",stdin); 28 int n,m,q,x,y; 29 while(scanf("%d%d%d",&n,&m,&q)!=EOF) 30 { 31 for(int i=1;i<=n;i++){ve[i].clear(),pa[i].clear();} 32 for(int i=0;i<=n;i++)biao[i]=i; 33 for(int i=1;i<=n;i++)scanf("%d",&age[i]); 34 for(int i=0;i<m;i++) 35 { 36 scanf("%d%d",&x,&y); 37 ve[y].push_back(x); 38 } 39 for(int i=1;i<=n;i++) 40 { 41 memset(vis,0,sizeof vis); 42 vis[i]=1; 43 int l=ve[i].size(); 44 for(int j=0;j<l;j++) 45 if(!vis[ve[i][j]])dfs(ve[i][j],i); 46 } 47 for(int i=0;i<q;i++) 48 { 49 scanf("%s",s); 50 if(s[0]=='T') 51 { 52 scanf("%d%d",&x,&y); 53 swap(age[biao[x]],age[biao[y]]); 54 swap(biao[x],biao[y]); 55 } 56 else 57 { 58 ans=999999; 59 scanf("%d",&x); 60 x=biao[x]; 61 int l=pa[x].size(); 62 for(int j=0;j<l;j++)ans=min(ans,age[pa[x][j]]); 63 if(ans==999999)puts("*"); 64 else printf("%d\n",ans); 65 } 66 } 67 } 68 return 0; 69 }