hdu 1829+hdu 1856(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1829
思路:就是同性别的合并在一个集合中,然后每次输入看u,v是否在同一个集合中。。。然后不知道为什么用路径压缩不可以写。。。一些就TLE了。。。无语了。。。orz。。。
View Code
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 const int MAXN=2000+20; 7 int parent[MAXN]; 8 int mark[MAXN]; 9 int n,m; 10 11 void Initiate(){ 12 memset(mark,0,sizeof(mark)); 13 for(int i=1;i<=n;i++){ 14 parent[i]=i; 15 } 16 } 17 18 int Find(int x){ 19 int s=x; 20 while(s!=parent[s]){ 21 s=parent[s]; 22 } 23 return s; 24 /* 25 int s; 26 for(s=x;parent[s]>=0;s=parent[s]); 27 while(s!=x){ 28 int tmp=parent[x]; 29 parent[x]=s; 30 x=tmp; 31 } 32 return s; 33 */ 34 } 35 36 void Union(int R1,int R2){ 37 int r1=Find(R1); 38 int r2=Find(R2); 39 if(r1<r2){ 40 parent[r2]=r1; 41 }else 42 parent[r1]=r2; 43 } 44 45 46 int main(){ 47 int _case,t=1; 48 scanf("%d",&_case); 49 while(_case--){ 50 scanf("%d%d",&n,&m); 51 Initiate(); 52 bool flag=true; 53 for(int i=1;i<=m;i++){ 54 int u,v; 55 scanf("%d%d",&u,&v); 56 if(!flag)continue; 57 if(Find(u)==Find(v)){ 58 //找到同性的了。。。 59 flag=false; 60 continue; 61 }else { 62 if(mark[u]==0)mark[u]=v; 63 else Union(mark[u],v);//同性的并入一个集合 64 if(mark[v]==0)mark[v]=u; 65 else Union(mark[v],u); 66 } 67 } 68 printf("Scenario #%d:\n",t++); 69 if(!flag){ 70 printf("Suspicious bugs found!\n"); 71 }else { 72 printf("No suspicious bugs found!\n"); 73 } 74 puts(""); 75 } 76 return 0; 77 }
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1856
思路:就是合并集合。。。赤裸裸的并查集啊!!!!可我为什么wa了无数次啊!!!!orz....
View Code
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 const int MAXN=10000000+100; 7 int parent[MAXN]; 8 int _count[MAXN]; 9 int n; 10 int MAX; 11 12 void Initiate(){ 13 for(int i=1;i<MAXN;i++){ 14 parent[i]=-1; 15 _count[i]=1; 16 } 17 } 18 19 int Find(int x){ 20 int s; 21 for(s=x;parent[s]>=0;s=parent[s]); 22 while(s!=x){ 23 int tmp=parent[x]; 24 parent[x]=s; 25 x=tmp; 26 } 27 return s; 28 } 29 30 31 void Union(int R1,int R2){ 32 int r1=Find(R1); 33 int r2=Find(R2); 34 if(r1!=r2){ 35 parent[r2]=r1; 36 _count[r1]+=_count[r2]; 37 } 38 } 39 40 int main(){ 41 while(~scanf("%d",&n)){ 42 Initiate(); 43 MAX=0; 44 for(int i=1;i<=n;i++){ 45 int u,v; 46 scanf("%d%d",&u,&v); 47 Union(u,v); 48 } 49 for(int i=1;i<MAXN;i++){ 50 if(parent[i]==-1&&_count[i]>MAX){ 51 MAX=_count[i]; 52 } 53 } 54 printf("%d\n",MAX); 55 } 56 return 0; 57 }