题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2860
思路:多了一个记录每个集合最小值的value数组而已,然后判断的时候小心一点就可以了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 100000+100 7 int parent[MAXN]; 8 int value[MAXN]; 9 int n,m,k; 10 11 void Initiate() 12 { 13 memset(value,-1,(n+2)*sizeof(int)); 14 for(int i=0;i<n;i++)parent[i]=i; 15 while(k--){ 16 int u,v; 17 scanf("%d%d",&u,&v); 18 if(value[v]==-1||u<value[v])value[v]=u; 19 } 20 } 21 22 23 int Find(int x) 24 { 25 if(x==parent[x]) 26 return x; 27 parent[x]=Find(parent[x]); 28 return parent[x]; 29 } 30 31 int main(){ 32 char str[11]; 33 int u,v; 34 while(~scanf("%d%d%d",&n,&k,&m)) 35 { 36 Initiate(); 37 while(m--){ 38 scanf("%s",str); 39 if(str[0]=='A'){ 40 scanf("%d%d",&u,&v); 41 if(parent[v]!=v){ puts("Reject");continue;} 42 puts("Accept"); 43 if(value[v]==-1||u<value[v])value[v]=u; 44 }else if(str[0]=='M'){ 45 scanf("%d%d",&u,&v); 46 if(parent[u]!=u||parent[v]!=v||u==v){ 47 puts("Reject"); 48 continue; 49 } 50 puts("Accept"); 51 parent[v]=u; 52 if(value[v]!=-1&&(value[u]==-1||value[u]>value[v])){ 53 value[u]=value[v]; 54 } 55 }else { 56 scanf("%d",&u); 57 if(parent[u]==u&&value[u]!=-1)printf("Lowest rate: %d.\n",value[u]); 58 else if(parent[u]==u&&value[u]==-1)printf("Company %d is empty.\n",u); 59 else printf("Company %d is a part of company %d.\n",u,Find(u)); 60 } 61 } 62 puts(""); 63 } 64 return 0; 65 }