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

来源:互联网 发布:语文网络培训心得体会 编辑:程序博客网 时间:2024/06/05 09:25

题目链接:
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;}
0 0
原创粉丝点击