当前位置: 代码迷 >> 综合 >> POJ 1466 Girls and Boys(最大独立点集)
  详细解决方案

POJ 1466 Girls and Boys(最大独立点集)

热度:78   发布时间:2023-12-08 10:56:19.0

题目链接:
POJ 1466 Girls and Boys
题意:
有n位学生,每位学生会和其他学生有“浪漫关系”,找到一个最大集合使得集合中的学生任意两个都不存在浪漫关系。
分析:
最大独立点集。有公式:
最大独立点集=点数量-最大匹配数
这题输入有毒。
每行的开始不一定是0,1,2,3…依次输入,太尴尬了!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <cmath>
#include <ctime>
#include <cassert>
#include <vector>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0)
using namespace std;
const int MAX_N=510;int n;
int match[MAX_N],used[MAX_N];
vector <int> edge[MAX_N];inline void init()
{for(int i=0;i<n;i++){edge[i].clear();}
}inline int dfs(int x)
{used[x]=1;for(int i=0;i<edge[x].size();i++){int u=edge[x][i],w=match[u];if(w<0||(!used[w]&&dfs(w))){match[u]=x;match[x]=u;return 1;}}return 0;
}int main()
{freopen("N.in","r",stdin);while(~scanf("%d",&n)){init();for(int i=0;i<n;i++){int id,num,t;scanf("%d: (%d)",&id,&num);for(int j=0;j<num;j++){scanf("%d",&t);edge[id].push_back(t);}}int res=0;memset(match,-1,sizeof(match));for(int i=0;i<n;i++){memset(used,0,sizeof(used));if(match[i]==-1) res+=dfs(i); //res是最大匹配对数}//printf("res=%d\n",res);int ans=n-res;printf("%d\n",ans);}return 0;
}