function HungarianAlgorithm(Left,Right,G)
maxMatch = 0
initiate an array matchedTo with -1
for each node u in Left part
initiate an array visited with false
if dfs(u) is true
maxMatch += 1
return maxMatch
function dfs(u)
for each node v that u links to
if visited[v] is true
continue
visited[v] = true
if matchedTo[v] is -1 or dfs(matchedTo[v])
matchedTo[v] = u
return true
return false
#include <iostream>
#include <string.h>
using namespace std;
bool G[110][110];
bool vis[110];
int link[110];
int n;
bool match(int u){
for(int i=1;i<=n;i++){
if(G[u][i]&&!vis[i]){
vis[i]=true;
if(link[i]==-1||match(link[i])){
link[i]=u;
return true;
}
}
}
return false;
}
int hungury(){
int ans=0;
memset(link,-1,sizeof(link));
for(int i=1;i<=n;i++){
memset(vis,false,sizeof(vis));
ans+=match(i);
}
return ans;
}
int main() {
memset(G,false,sizeof(G));
int m;
cin>>n>>m;
while(m--){
int a,b;
cin>>a>>b;
G[a][b]=1;
}
cout<<hungury()<<endl;
return 0;
}
字典序最小-距离序列
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e4+5;
bool vis[MAXN];
int link[MAXN];
int m,n;
int rlink[MAXN];
vector<int> G[MAXN];
bool match(int u){
int sz=G[u].size();
sort(G[u].begin(),G[u].end());
for(int i=0;i<sz;++i){
int v=G[u][i];
if(!vis[v]){
vis[v]=true;
if(link[v]==-1||match(link[v])){
link[v]=u;
return true;
}
}
}
return false;
}
int hungury(){
int ans=0;
memset(link,-1,sizeof(link));
for(int i=n-1;i>=0;--i){
memset(vis,false,sizeof(vis));
ans+=match(i);
}
return ans;
}
void init(){
for(int i=0;i<=n-1;i++) G[i].clear();
}
int main() {
while(~scanf("%d",&n)){
init();
int d,v;
for(int i=0;i<=n-1;i++){
scanf("%d",&d);
v=i-d;
if(v>=0&&v<=n-1&&abs(i-v)<=n-abs(i-v)) G[i].push_back(v);
v=i+d;
if(v>=0&&v<=n-1&&abs(i-v)<=n-abs(i-v)) G[i].push_back(v);
v=d-n+i;
if(v>=0&&v<=n-1&&abs(i-v)>=n-abs(i-v)) G[i].push_back(v);
v=n+i-d;
if(v>=0&&v<=n-1&&abs(i-v)>=n-abs(i-v)) G[i].push_back(v);
}
int ans=hungury();
if(ans<n) printf("No Answer\n");
else{
for(int i=0;i<=n-1;i++){
rlink[link[i]]=i;
}
for(int i=0;i<=n-1;i++){
if(i!=0) printf(" ");
printf("%d",rlink[i]);
}
printf("\n");
}
}
return 0;
}
/*
10
1 5 4 2 3 1 4 3 1 4
1 6 8 5 7 4 2 0 9 3
*/