牛客每日一题https://www.nowcoder.com/practice/f51fb4a38a464b1c86d0a0adf1920d65?channelPut=tracker2
#include <iostream>
#include <vector>
using namespace std;
int main() {
std::ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;cin>>n;
vector<vector<int>> adj(n+1);
for(int i=1;i<=n;i++){
int k;cin>>k;
for(int j=1;j<=k;j++){
int x;cin>>x;
adj[x].push_back(i);
}
}
vector<int> mark(n+1,-1);
vector<bool> vis(n+1,false);
auto dfs=[&](auto&& self,int u)->bool {
for(auto v:adj[u]){
if(vis[v]) continue;
vis[v]=true;
if(mark[v]==-1||self(self,mark[v])){
mark[v]=u;
return true;
}
}
return false;
};
int ans=0;
for(int i=1;i<=n;i++){
vis.assign(n+1, false);
if(dfs(dfs,i)) ans++;
}
if(ans!=n){
cout<<"kou is angry";
return 0;
}
for(int i=1;i<=n;i++){
cout<<mark[i]<<" ";
}
}
// 64 位输出请用 printf("%lld")
左匹配右,如果右侧没有匹配或者右侧之前匹配的这个能找到新的,就匹配当前的这个右。

京公网安备 11010502036488号