**:
這是hdu2255
#include#include#include#include#includeusing namespace std;
const int maxn = 305;
const int inf = 0x3f3f3f3f;
int love[maxn][maxn]; // 記錄每個妹子和每個男生的好感度
int ex_girl[maxn]; // 每個妹子的期望值
int ex_boy[maxn]; // 每個男生的期望值
bool vis_girl[maxn]; // 記錄每一輪匹配匹配過的女生
bool vis_boy[maxn]; // 記錄每一輪匹配匹配過的男生
int match[maxn]; // 記錄每個男生匹配到的妹子 如果沒有則為-1
int slack[maxn]; // 記錄每個漢子如果能被妹子傾心最少還需要多少期望值
int n;
bool dfs(int girl)
} else
}return false;
}int km()
}// 嘗試為每乙個女生解決歸宿問題
for (int i = 0; i < n; ++i) }}
// 匹配完成 求出所有配對的好感度的和
int res = 0;
for (int i = 0; i < n; ++i)
res += love[ match[i] ][i];
return res;
}int main()
return 0;
}
時間久了,上面的看不明白了,那就用下面這個吧
#include#include#includeusing namespace std;
const int qwq=0x7fffffff;
int w[1000][1000]; //w陣列記錄邊權值
int line[1000],u***[1000],usey[1000],cx[1000],cy[1000]; //line陣列記錄右邊端點所連的左端點, u***,usey陣列記錄是否曾訪問過,也是判斷是否在增廣路上,cx,cy陣列就是記錄點的頂標
int n,ans,m; //n左m右
bool find(int x)}}
return false;
}int km()
}if (d==qwq) return -1;
for (int j=1;j<=n;j++)
if (u***[j]) cx[j]-=d;
for (int j=1;j<=m;j++)
if (usey[j]) cy[j]+=d; //新增新邊}}
ans=0;
for (int i=1;i<=m;i++)
ans+=w[line[i]][i];
return ans;
}int main()
cx[i]=d;
}memset(line,0,sizeof(line));
printf("%d\n",km());
}return 0;
}//匈牙利演算法
//km演算法
KM演算法模板
km演算法是用來求完全二分圖最大完美匹配的演算法,其原理是不斷尋找增廣路 增廣路定理 相關性質 在最大二分圖匹配圖中,w x y lx x ly y include include include include include using namespace std const int maxn ...
模板 KM演算法
km 演算法計算帶權二分圖最優匹配 模板一 dfs 演算法,時間複雜度 o n 4 const int maxn 310 const ll inf 0x3f3f3f3f3f3f3f3f match i j表示右邊的第i個點匹配左邊的第j個點,也可能這兩個點之間其實沒有連邊,也就是權值為零 int n...
KM演算法模板
int maxdata 1000000000 int w arraysize arraysize 權值 int match arraysize 儲存匹配資訊,其中i為y中的頂點標號,match i 為x中頂點標號 int lx arraysize ly arraysize slack arraysi...