POJ 3697

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

你可能感兴趣的:(poj)