HDU 2860 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=2860
n个旅,k个兵,m条指令
AP 让战斗力为x的加入y旅
MG x旅y旅合并为x旅
GT 报告x旅的战斗力
几个需要注意的小问题是:已经被合并过的不能再参加合并这样就简化了并查集本身的复杂度只存在一层继承关系
一道简单的并查集题目,一开始不知道什么情况总是PE,格式上找不到错23333
后来参考了潘大神的代码,原来是最后回车的位置粗了偏擦23333
#include<stdio.h> #define inf 0x3f3f3f3f int par[200000]; int miner[200000]; int min(int a,int b) { if(a>b){return b;} else return a; } void atfirst(int n) { int i; for(i=0;i<n;i++) { par[i]=i; miner[i]=inf; } } int find(int x) { return x!=par[x]?par[x]=find(par[x]):x; } int main() { int i,k,n,m; int r,c; freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); while(scanf("%d%d%d",&n,&k,&m)!=EOF) { atfirst(n); for(i=1;i<=k;i++) { scanf("%d%d",&r,&c); miner[c]=min(r,miner[c]); } for(i=1;i<=m;i++) { char donser[5]; scanf("%s",&donser); if(donser[0]=='A') { scanf("%d%d",&r,&c); if(par[c]!=c){printf("Reject\n");continue;} miner[c]=min(r,miner[c]); printf("Accept\n"); } if(donser[0]=='M') { scanf("%d%d",&r,&c); if(r==c){printf("Reject\n");continue;} if(par[r]==r&&par[c]==c) { par[c]=r; miner[r]=min(miner[r],miner[c]); printf("Accept\n"); } else printf("Reject\n"); } if(donser[0]=='G') { scanf("%d",&r); if(par[r]==r&&miner[r]!=inf) printf("Lowest rate: %d.\n",miner[r]); else if(par[r]==r&&miner[r]==inf) printf("Company %d is empty.\n",r); else { printf("Company %d is a part of company %d.\n",r,find(r)); } } } printf("\n"); } return 0; }