作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
目前最著名的最大二分匹配算法是 O(√VE)。
下面是我解决上述问题的算法:给定两个集合 S1 和 S2 以及它们之间的 E 边。
step1:将S1和S2按度数升序排列
第2步:按排序顺序挑选集合中的元素并将其分配给另一个集合中的下一个空闲元素,计算匹配的数量。
第3步:在S1上执行第2步,然后在S2上执行。
第 4 步:取第 3 步的最大值。
这使得上述算法的复杂度为 O(Vlog(V)+(V+E))。
我无法证明上述算法的正确性,所以任何人都可以帮助我解决上述示例失败的任何反例,因为该算法不适用于 spoj 问题 MATCHING所以算法是错误的,但无法找出反例。
谢谢
#include<bits/stdc++.h>
#define ll long long int
using namespace std;
int main(){
ll c,b,p;
cin >> c >> b >> p;
c+=1;
b+=1;
ll mx = max(c,b);
c =mx;
b =mx;
vector<ll> adjcow[c];
vector<ll> adjbull[b];
for(ll i=0; i<p; i++){
ll x,y;
cin >> x >> y;
adjcow[x].push_back(y);
adjbull[y].push_back(x);
}
/*
for(ll i=0; i<c; i++){
cout << i << " ";
for(auto x:adjcow[i])
cout << x << " ";
cout << "\n";
}
for(ll i=0; i<b; i++){
cout << i << " ";
for(auto x : adjbull[i])
cout << x << " ";
cout << endl;
}
*/
vector<pair<ll, ll>> deg1(c);
vector<pair<ll, ll>> deg2(b);
for(ll i=0; i<c; i++){
ll count = 0;
for(auto x: adjcow[i])
count++;
deg1[i] = {count, i};
}
for(ll i=0; i<b; i++){
ll count = 0;
for(auto x: adjbull[i])
count++;
deg2[i] = {count,i};
}
sort(deg1.begin(), deg1.end());
sort(deg2.begin(), deg2.end());
vector<bool> isTaken1(c,0);
vector<bool> isTaken2(b,0);
/*
for(ll i=0; i<c; i++)
cout << deg1[i].first << " " << deg1[i].second << ", ";
cout << endl;
for(ll i=0; i<b; i++)
cout << deg2[i].first <<" "<< deg2[i].second << ", ";
cout << endl;
*/
ll ansCow =0;
for(auto x:deg1){
ll node = x.second;
for(auto u: adjcow[node]){
if(isTaken1[u]==0){
// cout << node << "-> " << u << "\n";
isTaken1[u] = 1;
ansCow++;
break;
}
}
}
//cout << "\n\n";
ll ansBull =0;
for(auto x:deg2){
ll node = x.second;
for(auto u: adjbull[node]){
if(isTaken2[u]==0){
// cout << node << "->" << u << "\n";
isTaken2[u] = 1;
ansBull++;
break;
}
}
}
cout << max(ansCow, ansBull) << "\n";
}
输入:
5 4 6
5 2
1 2
4 3
3 1
2 2
4 4
最佳答案
反例如下所示。请注意,每个节点的度数均为 2,因此排序无效。从左往右连接时,如果1选A,2选B,则3不能连接。所以结果是2,从右往左连接的时候,如果A选1,B选2,那么C就不能连接。结果又是2。但正确结果是3,1接C,2接B,3接A。
程序的输入是:
3 3 6
1 1
1 3
2 2
2 3
3 1
3 2
关于algorithm - 最大二分匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52961502/
我正在尝试编写一个程序,在名为 items 的数组中进行顺序搜索和二分搜索,该数组具有 10000 个已排序的随机 int 值。第二个名为 targets 的数组加载了 1000 个 int 值(50
当我尝试使用图表并为其编写一些代码但没有成功时,我遇到了一个问题:/!! 我想创建一些东西来获取图形数据并检查它是否:1- 连接2-二分法3-有循环4-是一棵树 所以我想知道,例如,是否可以将其写入以
我是一名优秀的程序员,十分优秀!