hdu 3718Similarity

mac2025-09-28  12

#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef int lint; const int maxn = 10005; const lint inf = 0x3f3f3f3f; namespace KM { const int N = 505; int n,m; lint cost[N][N]; lint lx[N], ly[N], match[N], slack[N]; int prev[N]; bool vy[N]; void init(int _n,int _m) { n = _n; m = _m; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cost[i][j] = 0; } bool augment(int root) { fill(vy, vy + m + 1, false); fill(slack, slack + m + 1, inf); int py; match[py = 0] = root; do { vy[py] = true; int x = match[py], yy; lint delta = inf; for (int y = 1; y <= m; y++) { if (!vy[y]) { if (lx[x] + ly[y] - cost[x][y] < slack[y]) { slack[y] = lx[x] + ly[y] - cost[x][y]; prev[y] = py; } if (slack[y] < delta) { delta = slack[y]; yy = y; } } } if( delta >= inf || delta <= -inf ) return false; for (int y = 0; y <= m; y++) { if (vy[y]) { lx[match[y]] -= delta; ly[y] += delta; } else slack[y] -= delta; } py = yy; } while (match[py] != -1); do { int pre = prev[py]; match[py] = match[pre]; py = pre; } while (py); return true; } bool KM(lint& Cost) { for( int i = 1;i <= m;i++ ) { ly[i] = 0;match[i] = -1; } for (int i = 1; i <= n; i++) { lx[i] = 0; for (int j = 1; j <= m; j++) lx[i] = max(lx[i], cost[i][j]); } for (int root = 1; root <= n; root++) { if(!augment(root))return false; } Cost = 0; for( int i = 1;i <= m;i++ ){ if( match[i] != -1 ){ Cost += cost[match[i]][i]; } } return true; } } int a[maxn],b[maxn]; vector<int> vea,veb; void discrete( vector<int>& ve ){ sort( ve.begin(),ve.end() ); ve.erase( unique(ve.begin(),ve.end()),ve.end() ); } int ha( int x ){ return lower_bound( vea.begin(),vea.end(),x ) - vea.begin()+1; } int hb( int x ){ return lower_bound(veb.begin(),veb.end(),x) - veb.begin()+1; } int main(){ int T,n,m,k; scanf("%d",&T); char ss[10]; while(T--){ scanf("%d%d%d",&n,&k,&m); vea.clear(); for( int i = 1;i <= n;i++)scanf("%s",ss),a[i] = ss[0]-'A'+1,vea.push_back(a[i]); for( int i= 1;i <= m;i++ ){ veb.clear(); for( int j= 1;j <= n;j++ )scanf("%s",ss),b[j] = ss[0]-'A'+1,veb.push_back(b[j]); discrete(vea);discrete(veb); KM::init( veb.size(),k ); for( int j = 1;j <= n;j++ ){ int bb= hb(b[j]),aa = ha(a[j]); //if( KM::cost[bb][aa] == -inf ) KM::cost[bb][aa] = 1; KM::cost[bb][aa]++; } int ans; KM::KM(ans); double res = 1.0*ans /n; if( res < 1e-5 && res > -1e-5 )puts("0"); else printf("%.4lf\n",res); } } return 0; }

 

最新回复(0)