hdu2473
hdu2473
并查集的删除操作
建立虚点,删除它就断掉了它在原图中的所有关系,而成为独立节点,而且它只能被删除一次,而且删除之后还能进行操作,采用映射(虚点)的方法,建立虚点并把删除之后的操作挪到虚点上来。啊,初始化确实有问题,有可能多次删除的,所以要按操作的数量来,比如全部删除等等数据,哭了
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<algorithm> 5 #include<cmath> 6 #include<ctime> 7 #include<set> 8 #include<map> 9 #include<stack> 10 #include<cstring> 11 #define inf 2147483647 12 #define ls rt<<1 13 #define rs rt<<1|1 14 #define lson ls,nl,mid,l,r 15 #define rson rs,mid+1,nr,l,r 16 #define N 2000010 17 #define For(i,a,b) for(int i=a;i<=b;i++) 18 #define p(a) putchar(a) 19 #define g() getchar() 20 21 using namespace std; 22 int n,m; 23 char c; 24 int d[N],id[N]; 25 int x,y; 26 int cnt; 27 int tot; 28 set<int>s; 29 void in(int &x){ 30 int y=1; 31 char c=g();x=0; 32 while(c<'0'||c>'9'){ 33 if(c=='-')y=-1; 34 c=g(); 35 } 36 while(c<='9'&&c>='0'){ 37 x=(x<<1)+(x<<3)+c-'0';c=g(); 38 } 39 x*=y; 40 } 41 void o(int x){ 42 if(x<0){ 43 p('-'); 44 x=-x; 45 } 46 if(x>9)o(x/10); 47 p(x%10+'0'); 48 } 49 50 int find(int x){ 51 if(d[x]==x)return x; 52 return d[x]=find(d[x]); 53 } 54 55 int main(){ 56 while(cin>>n>>m&&(n+m)){ 57 For(i,0,N) 58 d[i]=i; 59 For(i,0,n-1) 60 id[i]=i; 61 cnt=n; 62 while(m--){ 63 cin>>c; 64 if(c=='M'){ 65 in(x);in(y); 66 int t1=find(id[x]); 67 int t2=find(id[y]); 68 if(t1!=t2) 69 d[t1]=t2; 70 } 71 if(c=='S'){ 72 in(x); 73 id[x]=cnt++; 74 } 75 } 76 s.clear(); 77 For(i,0,n-1) 78 s.insert(find(id[i])); 79 cout<<"Case #"<<++tot<<": "<<s.size()<<endl; 80 } 81 return 0; 82 }