搭配飞行员
题目链接:https://loj.ac/problem/6000
题意:每个飞机都有一个正飞行员和次飞行员,但有些飞行员不能在同一个飞机里,问最多能起飞多少飞机。
思路:用二分图对飞行员进行匹配就可以了
#include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<string> #include<algorithm> #include<queue> #include<map> typedef long long ll; using namespace std; int n,m; int a[105][105],b[105]; bool vis[105]; void init() { int i,j; scanf("%d%d",&n,&m); int u,v; memset(a,0,sizeof(a)); while (~scanf("%d%d",&u,&v)) a[u][v]=a[v][u]=1; memset(b,-1,sizeof(b)); } int match(int u) { int i,j; for (i=m+1; i<=n; i++) { if (a[u][i] && !vis[i]) { vis[i]=true; if (b[i]==-1 || match(b[i])) { b[i]=u; return 1; } } } return 0; } int main() { init(); int ans=0; for (int i=1; i<=m; i++) { memset(vis,false,sizeof(vis)); ans+=match(i); } printf("%d",ans); return 0; }