题意:给出一个n个点的无向完全图,然后删去m条边,问还有哪些点与1相连(不包括1)
题解:n<=10000,m<=1000000,若直接建反图无论怎样都会暴内存,因为最多1Y条边。于是将删去的边存入hash表中,每次走动时看看边是否在hash表中即可。
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int mod=10000007; 6 int hash[mod]; 7 int getkey(int x) 8 { 9 int i=1,y=x; 10 y%=mod; 11 while(hash[y]!=-1&&hash[y]!=x) 12 { 13 y+=i*i; 14 i++; 15 if(y>=mod) 16 y%=mod; 17 } 18 return y; 19 } 20 int stk[10005]; 21 bool vis[10005]; 22 int main() 23 { 24 int n,m,ca=0; 25 while(scanf("%d%d",&n,&m),n,m) 26 { 27 memset(hash,-1,sizeof(hash)); 28 memset(vis,false,sizeof(vis)); 29 for(int i=0,a,b;i<m;i++) 30 { 31 scanf("%d%d",&a,&b); 32 a=a*10000+b; 33 hash[getkey(a)]=a; 34 } 35 int f=0,r=1; 36 stk[0]=1; 37 vis[1]=true; 38 while(f!=r) 39 { 40 int now=stk[f++]; 41 for(int i=2;i<=n;i++) 42 { 43 if(!vis[i]&&hash[getkey(now*10000+i)]==-1&&hash[getkey(i*10000+now)]==-1) 44 { 45 stk[r++]=i; 46 vis[i]=true; 47 } 48 } 49 } 50 printf("Case %d: %d\n",++ca,r-1); 51 } 52 return 0; 53 }