hdu 3461 Code Lock 并查集(有点难想到)★★
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 3461 Code Lock 并查集(有点难想到)★★相关的知识,希望对你有一定的参考价值。
1 #include<stdio.h> 2 #include<math.h> 3 int set[10000005]; 4 int count; 5 #define mod 1000000007 6 7 int find(int x) 8 { 9 int r=x; 10 while(r!=set[r]) 11 r=set[r]; 12 int i=x; 13 while(i!=r) 14 { 15 int j=set[i]; 16 set[i]=r; 17 i=j; 18 } 19 return r; 20 } 21 22 void merge(int x,int y) 23 { 24 int fx=find(x); 25 int fy=find(y); 26 if(fx!=fy) 27 { 28 set[fx]=fy; 29 count++; 30 } 31 } 32 33 long long exp(int n){ 34 long long sum=1, tmp=26; 35 while(n){ 36 if(n&1) //n%2==1 37 { 38 sum = sum*tmp; 39 sum %= mod; 40 } 41 tmp = (tmp*tmp)%mod; 42 n>>=1; // n/=2; 43 } 44 return sum; 45 } 46 47 int main() 48 { 49 int n,m,l,r; 50 while(scanf("%d%d",&n,&m)!=EOF) 51 { 52 count=0; 53 for(int i=0;i<=n;i++)//i=0,错在i=1 54 set[i]=i; 55 for(int i=1;i<=m;i++) 56 { 57 scanf("%d%d",&l,&r); 58 merge(l-1,r);//若果是l-1,上边初始化就从0开始,如果用merge(l,r+1),初始化i是1到n+1 59 } 60 printf("%lld\n",exp(n-count)%mod); 61 } 62 return 0; 63 }
以上是关于hdu 3461 Code Lock 并查集(有点难想到)★★的主要内容,如果未能解决你的问题,请参考以下文章