#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn=110; int g[maxn][maxn]; int cnt_node;//点的个数 int dis[maxn]; int match[maxn]; bool vis[maxn]; int st[maxn],top; bool dfs(int u) { st[top++]=u; if(vis[u]) return true; vis[u]=true; for(int i=0;i<cnt_node;i++) { if(i!=u&&i!=match[u]&&!vis[i]) { int t=match[i]; if(dis[t]<dis[u]+g[u][i]-g[i][t]) { dis[t]=dis[u]+g[u][i]-g[i][t]; if(dfs(t)) return true; } } } top--; vis[u]=false; return false; } int p[maxn]; //返回最大匹配权值 int get_match(int n) { cnt_node=n; for(int i=0;i<cnt_node;i++) p[i]=i; for(int i=0;i<cnt_node;i+=2) { match[i]=i+1; match[i+1]=i; } int cnt=0; while(1) { memset(dis,0,sizeof(dis)); memset(vis,0,sizeof(vis)); top=0; bool update=false; for(int i=0;i<cnt_node;i++) { if(dfs(p[i])) { update=true; int temp=match[st[top-1]]; int j=top-2; while(st[j]!=st[top-1]) { match[temp]=st[j]; swap(temp,match[st[j]]); j--; } match[temp]=st[j]; match[st[j]]=temp; break; } } if(!update) { cnt++; if(cnt>=3) break; random_shuffle(p,p+cnt_node); } } int ans=0; for(int i=0;i<cnt_node;i++) { int v=match[i]; if(i<v) ans+=g[i][v]; } return ans; }