╮(╯▽╰)╭ 数蚂蚁
TimeLimit: 2000/1000 MS (Java/Others) MenoryLimit: 65536/32768 K (Java/Others)
64-bit integer IO format:%I64d
Problem Description
Lh Boy无聊的时候很喜欢数蚂蚁,而且,还给每一只小蚂蚁编号,通过他长期的观察和记录,发现编号为i的蚂蚁会和编号为j的蚂蚁在一起。
现在问题来了,他现在只有他的那本记录本,然而,他想要知道,他所观察的蚂蚁中,有多少堆蚁群。没有记录的编号则作为独自一个一堆。
Input
第一行输入一个整数T,表示有T(1<=T<=25)组测试案例。每一组测试案例,先输入两个整数N和M,分别表示蚂蚁的总数(编号分别为1~N)和记录的条数(1<=N,M<=1000)。紧接着有M行,每一行输入两个数字,a b,表示编号a和编号b的蚂蚁在同一堆里面。在每组测试案例之间都会输入一行空行。
Output
对于每组测试案例,在一行中输出答案。
SampleInput
2 5 3 1 2 2 3 4 5 5 1 2 5
SampleOutput
2 4解法:就是基础的并查集。。。代码:
1 #include <iostream> 2 #include <string.h> 3 #include <stdio.h> 4 #include <map> 5 using namespace std; 6 int ID[10086]; 7 void Cread(int N) 8 { 9 for(int i=0;i<=N;i++)ID[i]=i; 10 } 11 int Find(int x) 12 { 13 int tmp; 14 if(ID[x]!=x)tmp=Find(ID[x]); 15 else tmp=x; 16 ID[x]=tmp; 17 return tmp; 18 } 19 int main() 20 { 21 int N,M,i,j,k,T; 22 scanf("%d",&T); 23 while(T--) 24 { 25 scanf("%d%d",&N,&M); 26 Cread(N); 27 int a,b; 28 int sign=0; 29 for(i=0;i<M;i++) 30 { 31 scanf("%d%d",&a,&b); 32 a=Find(a); 33 b=Find(b); 34 if(a!=b) 35 { 36 sign++; 37 ID[a]=b; 38 } 39 } 40 printf("%d\n",N-sign); 41 } 42 return 0; 43 }
时间: 2024-10-10 07:47:56