The only thing to say about this problem is that the normal Hungarian algorithm is O (nm)
Then the HK algorithm can be O (n^0.5m), the algorithm can find many of the same length of the shortest augmented path each time
Analysis See: http://www.hardbird.net/lightoj-1356-prime-independence%e6%9c%80%e5%a4%a7%e7%8b%ac%e7%ab%8b%e9%9b%86- hopcroft-carp%e7%ae%97%e6%b3%95/
#include <cstdio>#include<iostream>#include<ctime>#include<vector>#include<cmath>#include<map>#include<queue>#include<algorithm>#include<cstring>using namespaceStd;typedefLong LongLL;Const intn=4e4+5;Const intinf=0x3f3f3f3f;intprime[45000],cnt,t,n;inta[n],p[2][500005];vector<int>Fac[n],g[n];voidGetprime () {BOOLv[500005]; memset (V,0,sizeof(v)); for(intI=2; i*i<=500000;++i)if(!V[i]) for(intj=i*i;j<=500000; j+=i) v[j]=1; for(intI=2; i<=500000;++i)if(!v[i]) prime[++cnt]=i; }intMx[n],my[n],dx[n],dy[n],dis;BOOLUsed[n];BOOLSEARCHP () {Queue<int>Q; Dis=INF; memset (DX,-1,sizeof(DX)); memset (DY,-1,sizeof(DY)); for(intI=1; i<=n;++i)if(mx[i]==-1) {Q.push (i); Dx[i]=0; } while(!Q.empty ()) { intu=Q.front (); Q.pop (); if(Dx[u]>dis) Break; for(intI=0; I<g[u].size (); + +i) { intv=G[u][i]; if(dy[v]!=-1)Continue; DY[V]=dx[u]+1; if(my[v]==-1) dis=Dy[v]; Else{Dx[my[v]]=dy[v]+1; Q.push (My[v]); } } } returndis!=INF; }BOOLDfsintu) { for(intI=0; I<g[u].size (); + +i) { intv=G[u][i]; if(!used[v]&&dy[v]==dx[u]+1) {Used[v]=true; if(my[v]!=-1&&dy[v]==dis)Continue; if(my[v]==-1||DFS (My[v])) {My[v]=u; Mx[u]=v; return true; } } } return false;}intMaxmatch () {intres=0; memset (Mx,-1,sizeof(Mx)); memset (My,-1,sizeof(My)); while(SEARCHP ()) {memset (used,0,sizeof(used)); for(intI=1; i<=n;++i)if(mx[i]==-1&&dfs (i) + +Res; } returnRes;}intMain () {getprime (); intcas=0; scanf ("%d",&T); while(t--) {scanf ("%d",&N); Memset (P,-1,sizeof(p)); for(intI=1; i<=n;++i) {scanf ("%d",&A[i]); G[i].clear (); Fac[i].clear (); inttot=0, t=A[i]; for(intj=1;p rime[j]*prime[j]<=t;++j) { if(t%prime[j]==0) {fac[i].push_back (prime[j]); while(t%prime[j]==0) t/=prime[j],++tot; } } if(t>1) Fac[i].push_back (t), + +tot; P[tot&1][a[i]]=i; } for(intI=1; i<=n;++i) { if(p[0][a[i]]!=-1){ for(intj=0; J<fac[i].size (); + +j) { inttmp=a[i]/Fac[i][j]; if(p[1][tmp]==-1)Continue; G[i].push_back (p[1][tmp]); } } Else{ for(intj=0; J<fac[i].size (); + +j) { inttmp=a[i]/Fac[i][j]; if(p[0][tmp]==-1)Continue; g[p[0][tmp]].push_back (i); }}} printf ("Case %d:%d\n", ++cas,n-Maxmatch ()); } return 0;}View Code
Lightoj 1356 Prime Independence binary graph Max independent set, HK algorithm