| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
为什么这样的hash能AC,数组才1000居然AC了,谁能解释解释#include<stdio.h>
#include<iostream>
using namespace std;
#define VERTEX_NUM 1000
int color[VERTEX_NUM],set[VERTEX_NUM];
int Hash(char * str)
{
int hash = 1;
while(*str)
hash = (hash*29 + *str++ - 'a')%VERTEX_NUM;
return hash;
}
int find_set(int x)
{
int tmp=0;
int root=x;
while(set[root]>=0)
{
root=set[root];
}
while(x!=root)
{
tmp=set[x];
set[x]=root;
x=tmp;
}
return root;
}
void union_set(int root1,int root2)
{
int sum = set[root1]+set[root2];
if(set[root1]>set[root2])
{
set[root1] = root2;
set[root2] = sum;
}
else
{
set[root2] = root1;
set[root1] = sum;
}
}
int main()
{
int n1,n2,n=0,root1,root2,i,no=0;
char a[11],b[11];
for(i=0;i<VERTEX_NUM;++i)
{
set[i]=-1;
color[i]=0;
}
while(scanf("%s%s",a,b)!=EOF)
{
++n;
n1=Hash(a);
n2=Hash(b);
++color[n1];
++color[n2];
root1=find_set(n1);
root2=find_set(n2);
if(root1!=root2)
union_set(root1,root2);
}
int root=1;
for(int i=0;i<VERTEX_NUM;++i)
{
if(color[i]>0)
{
if(color[i]%2)
{
++no;
if(no>2)
{
printf("Impossible\n");
return 0;
}
}
if(root==1)
root = find_set(i);
else
if(root!=find_set(i)){ printf ("Impossible\n");return 0;}
}
}
printf("Possible\n");
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator