P7368 [USACO05NOV]Asteroids G(二分图最大独立集)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P7368 [USACO05NOV]Asteroids G(二分图最大独立集)相关的知识,希望对你有一定的参考价值。
P7368 [USACO05NOV]Asteroids G(二分图最大独立集)
比较经典的二分图最大独立集建模问题。
code
// Problem: P7368 [USACO05NOV]Asteroids G
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P7368
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// Date: 2021-07-06 09:21:47
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=505,M=3e5+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0)
void Print(int *a,int n){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
}
int n,k;
bitset<N>vis;
struct edge{
int to,nt;
}e[M];
int h[N],cnt,mh[N];
void add(int u,int v){
e[++cnt]={v,h[u]},h[u]=cnt;
}
bool find(int u){
for(int i=h[u];i;i=e[i].nt){
int v=e[i].to;
if(vis[v]) continue;
vis[v]=1;
if(!mh[v]||find(mh[v])){
mh[v]=u;
return true;
}
}
return false;
}
int main(){
scanf("%d%d",&n,&k);
//set<int>s;
for(int i=1;i<=k;i++){
int x,y;
scanf("%d%d",&x,&y);
// s.insert(x);
add(x,y);
}
int ans=0;
for(int i=1;i<=n;i++) {
vis.reset();if(find(i)) ans++;
}
/*for(int x:s){
vis.reset();
if(find(x)) ans++;
}*/
printf("%d\\n",ans);
return 0;
}
以上是关于P7368 [USACO05NOV]Asteroids G(二分图最大独立集)的主要内容,如果未能解决你的问题,请参考以下文章
络谷 P2865 [USACO06NOV]路障Roadblocks