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
",ans);
65             }
66         }
67     }
68     return 0;
69 }
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3425647.html