|
| 1 | +const int N=405,W=64,NL=2,S=256,inf=~0u>>1; |
| 2 | +typedef unsigned long long ull; |
| 3 | +void bool_mat_mul(int a[],int b[],int c[],int n){ //O(n^3/(w log n)) |
| 4 | + static ull f[N/W+1][N/NL][N/W+1],B[N/NL][N],ans[N][N/W+1]; |
| 5 | + int L=max((int)floor(log2(max(n/W,1))),1),n1=(n-1)/L+1,n2=(n-1)/W+1; |
| 6 | + for (int i=0;i<(1<<L);++i) |
| 7 | + for (int j=0;j<n1;++j) |
| 8 | + memset(f[i][j],0,sizeof(ull)*n2); |
| 9 | + for (int i=0;i<n;++i)memset(ans[i],0,sizeof(ull)*n2); |
| 10 | + for (int i=0;i<n1;++i) |
| 11 | + for (int j=0;j<n;++j){ |
| 12 | + B[i][j]=0; int l=min(L,n-i*L); |
| 13 | + for (int k=0;k<l;++k)if (b[(i*L+k)*n+j])B[i][j]|=1ull<<k; |
| 14 | + } |
| 15 | + for (int I=0;I<(1<<L);++I) |
| 16 | + for (int i=0;i<n1;++i) |
| 17 | + for (int j=0;j<n;++j) |
| 18 | + if (I&B[i][j])f[I][i][j/W]|=1ull<<j%W; |
| 19 | + for (int i=0;i<n1;++i) |
| 20 | + for (int j=0;j<n;++j){ |
| 21 | + ull x=0; int l=min(L,n-i*L); |
| 22 | + for (int k=0;k<l;++k)if (a[j*n+(i*L+k)])x|=1ull<<k; |
| 23 | + //for (int k=0;k<n2;++k)ans[j][k]|=f[x][i][k]; |
| 24 | + ull *startA=ans[j],*startB=f[x][i],*endA=ans[j]+n2; |
| 25 | + while (startA!=endA)*startA++|=*startB++; |
| 26 | + } |
| 27 | + for (int i=0;i<n;++i) |
| 28 | + for (int j=0;j<n;++j)c[i*n+j]=(ans[i][j/W]&(1LL<<j%W))>0; |
| 29 | +} |
| 30 | +bitset<S> c[N][N/S+1]; |
| 31 | +int d[N],_d[N],id[N],rid[N],a[N*N],b[N*N],f[N*N],mark[N][N]; |
| 32 | +inline bool cmp(int x,int y){return d[x]<d[y];} |
| 33 | +class Solution { |
| 34 | +public: |
| 35 | + int minTrioDegree(int n, vector<vector<int>>& edges) { |
| 36 | + int ans=inf; |
| 37 | + for (int i=0;i<n;++i){ |
| 38 | + d[i]=0,id[i]=i; |
| 39 | + for (int j=0;j<(n-1)/S+1;++j)c[i][j].reset(); |
| 40 | + } |
| 41 | + for (auto &e:edges){ |
| 42 | + int x=--e[0],y=--e[1]; |
| 43 | + ++d[x]; ++d[y]; |
| 44 | + } |
| 45 | + sort(id,id+n,cmp); |
| 46 | + for (int i=0;i<n;++i)rid[id[i]]=i,_d[i]=d[i]; |
| 47 | + for (int i=0;i<n;++i)d[i]=_d[id[i]]; |
| 48 | + for (auto &e:edges){ |
| 49 | + int x=rid[e[0]],y=rid[e[1]]; if (x>y)swap(x,y); |
| 50 | + c[x][y/S].set(y%S,1); |
| 51 | + } |
| 52 | + for (int i=0;i<n;++i) |
| 53 | + for (int j=0;j<n;++j)a[i*n+j]=b[i*n+j]=0,mark[i][j]=c[i][j/S][j%S]; |
| 54 | + for (int I=0;I*S<n;++I){ |
| 55 | + for (int i=0;i<n;++i) |
| 56 | + for (int j=0;j<S&&I*S+j<n;++j)a[i*n+I*S+j]=b[(I*S+j)*n+i]=c[i][I][j]; |
| 57 | + bool_mat_mul(a,b,f,n); |
| 58 | + for (int i=0;i<n-2;++i) |
| 59 | + for (int j=i+1;j<n-1;++j)if (mark[i][j]&&f[i*n+j]){ |
| 60 | + mark[i][j]=0; |
| 61 | + int k=(c[i][I]&c[j][I])._Find_first(); |
| 62 | + ans=min(ans,d[i]+d[j]+d[I*S+k]); |
| 63 | + } |
| 64 | + } |
| 65 | + return ans<inf?ans-6:-1; |
| 66 | + } |
| 67 | +}; |
| 68 | + |
| 69 | +//IO |
| 70 | +int _IO=[](){ |
| 71 | + ios::sync_with_stdio(0); |
| 72 | + cin.tie(0); //cout.tie(0); |
| 73 | + return 0; |
| 74 | +}(); |
| 75 | + |
0 commit comments