题意:给出一个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 }