zoj_2833

直接用並查集。對於輸出需要注意空格問題,一開始在糾結怎麼輸出,然後參考了zxy_snow 輸出。


#include <stdio.h>
#include <iostream>
#include <string.h>

using namespace std;

int fri[100010];

int find(int x)
{
  int s=x;
  while(fri[x]>0)
	  x=fri[x];
  while(s!=x)
  {
    int t=fri[s];
	fri[s]=x;
	s=t;
  }
  return s;
}

void Union(int x,int y)
{
  int r1=find(x);
  int r2=find(y);
  if(r1!=r2)
  {
     int temp=fri[r1]+fri[r2];
	 if(fri[r1]>fri[r2])//xiaoshu
	 {
	   fri[r1]=r2;
	   fri[r2]=temp;
	 }
	 else
	 {
	   fri[r2]=r1;
	   fri[r1]=temp;
	 }
  }
}

int main()
{
    int n,m;
	int t=0;
	//freopen("1.txt","r",stdin);
	while(~scanf("%d%d",&n,&m)&&n)
	{ 	if(t)
			printf("\n");
		t++;
	  printf("Case %d:\n",t);
	  
	   for(int i=1;i<=n;i++)
		   fri[i]=-1;
	   while(m--){
	   char s[2];
	   scanf("%s",s);
	   if(s[0]=='M')
	   {
		   int a,b;
		   scanf("%d%d",&a,&b);
		   Union(a,b);
	   
	   }
	   else
	   {  int x;
	       scanf("%d",&x);
	      printf("%d\n",-fri[find(x)]);
	   }}
	}


  return 0;
}


發佈了41 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章