88分代码 WA on #12
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int Maxn = 305;
vector<int> g[Maxn], path[Maxn];
int match[Maxn], n, m, ans, to[Maxn], cnt = 1;
bool st[Maxn], vis[Maxn];
bool find(int u){
for(auto v : g[u]){
if(st[v]) continue;
st[v] = 1;
if(!match[v] || find(match[v])){
match[v] = u;
to[u] = v;
return true;
}
}
return false;
}
void print(int u){
path[cnt].push_back(u);
vis[u] = 1;
if(!to[u]){cnt ++; return;}
print(to[u] - n);
}
signed main(){
cin >> n >> m;
for(int i = 1, u ,v; i <= m; i ++){
cin >> u >> v;
g[u].push_back(v + n);
}
for(int i = 1; i <= n; i ++){
memset(st, 0, sizeof(st));
if(find(i)) ans ++;
}
//memset(to + 1, to + n + 1);
for(int i = 1; i <= n; i ++) if(!vis[i]) print(i);
for(int i = 1; i < cnt; i ++){
for(auto j : path[i]) cout << j << ' ';
cout << '\n';
}
cout << n - ans;
return 0;
}
最后一个点的数据需要排序能过
#include<bits/stdc++.h>
using namespace std;
const int Maxn = 305;
vector<int> g[Maxn], path[Maxn];
int match[Maxn], n, m, ans, to[Maxn], cnt = 1;
bool st[Maxn], vis[Maxn];
bool find(int u){
for(auto v : g[u]){
if(st[v]) continue;
st[v] = 1;
if(!match[v] || find(match[v])){
match[v] = u;
to[u] = v;
return true;
}
}
return false;
}
void print(int u){
path[cnt].push_back(u);
vis[u] = 1;
if(!to[u]){cnt ++; return;}
print(to[u] - n);
}
int main(){
cin >> n >> m;
for(int i = 1, u ,v; i <= m; i ++){
cin >> u >> v;
g[u].push_back(v + n);
}
for(int i = 1; i <= n; i ++){
memset(st, 0, sizeof(st));
if(find(i)) ans ++;
}
sort(to + 1, to + n + 1);
for(int i = n; i >= 1; i --) if(!vis[i]) print(i);
for(int i = 1; i < cnt; i ++){
for(auto j : path[i]) cout << j << ' ';
cout << '\n';
}
cout << n - ans;
return 0;
}
但是其他点会MLE
求助怎么解决这两个代码中的问题。
(最后根据数据将两个代码缝合AC此题的代码就不放了