第一道二部图题。用了lab104_yifan的模板搞了搞。
暂时还是没有发现left的准确含义,G要用类似于g[i]中的i上线替代。
后知后觉,g[]维度顺序什么的有点奇怪
输出顺序换一下什么的都无所谓。
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1005;
int t, r, c;
vector<int> g[N];
int left[N], vis[N];//left表示者二分图左边的状况
bool dfs(int u) {
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i];
if (vis[v]) continue;
vis[v] = 1;
if (!left[v] || dfs(left[v])) {
left[v] = u;
return true;
}
}
return false;
}
int save[N];//该数组会在匹配成功,c>r时生效
void hungary() {
int ans = 0;
memset(left, 0, sizeof(left));
for (int i = 1; i <= r; i++) {
memset(vis, 0, sizeof(vis));
if (dfs(i)) ans++;//ans相当于二部图里面成功匹配数目= =那个专用语怎么说来着= =
}
if(r!=ans){
printf("NO\n");
return;
}
for(int i=1;i<=c;i++){
printf("%d%c",left[i]?left[i]:save[i],i==c?'\n':' ');
}
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d%d",&r,&c);
for(int i=1;i<=c;i++)
g[i].clear();
for(int i=1;i<=c;i++){
for(int j=0;j<2;j++){
int tmp;
scanf("%d",&tmp);
g[tmp].push_back(i);
save[i]=tmp;
}
}
hungary();
}
return 0;
}
点击打开链接