hdu 4277
DFS+HASH三角形三边判重
每一条边可以由多条线段组成,判断俩个三角形不同是至少有一条边不等
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int mm=55; const int mod=1000007; int len[mm]; struct hashtable { int h[mod],s[mod][3],p[mod],size; int hash(int a,int b,int c) { return ((((a*131+b)*131+c)*131)&0x7FFFFFFF)%mod; } void insert(int a,int b,int c) { int i,id=hash(a,b,c); for(i=h[id];i>=0;i=p[i]) if(a==s[i][0]&&b==s[i][1]&&c==s[i][2])return; s[size][0]=a,s[size][1]=b,s[size][2]=c; p[size]=h[id],h[id]=size++; } void clear() { size=0; memset(h,-1,sizeof(h)); } }g; void check(int a,int b,int c) { if(a+b<=c||a+c<=b||b+c<=a)return; g.insert(a,b,c); } int a,b,c,n; void dfs(int l) { if(l>=n) { if(a<=b&&b<=c)check(a,b,c); return; } a+=len[l]; dfs(l+1); a-=len[l]; b+=len[l]; dfs(l+1); b-=len[l]; c+=len[l]; dfs(l+1); c-=len[l]; } int main() { int i,t; scanf("%d",&t); while(t--) { g.clear(); scanf("%d",&n); for(i=0;i<n;++i) scanf("%d",&len[i]); a=b=c=0; dfs(0); printf("%d\n",g.size); } return 0; }