poj 2771 uva12083 Guardian of Decency(二分图最大独立集)
2017-05-11 23:01
405 查看
题意:有一个十分保守的老师,准备带n个学生出游,他担心学生之间会成为couple,他认为按照以下规则可以使他们成为couple的可能性降低。
1.两人之间的身高差大于40
2.两人同性
3.喜欢的音乐风格不同
4.最喜欢的运动相同(理由是:可能支持不同的队伍而大打出手)
只要满足一个,就两人成为couple的可能性就很低,符合老师的要求。现在要求从n个人中,选出人数最多,且成为couple的可能性低。
思路:反建图法:任意两个人,如果以上4个条件都不满足,说明成为couple的可能性很高,不符合老师的要求。给他们连上一条边,图建好后,求出最大独立集。而最大独立集的定义是:一个点集,任意点之间不相邻(没边),且数量最多。而没边说明就是有边的反义(取反),也即成为couple的可能性很低。
最大独立集=n-最大基数匹配
1.两人之间的身高差大于40
2.两人同性
3.喜欢的音乐风格不同
4.最喜欢的运动相同(理由是:可能支持不同的队伍而大打出手)
只要满足一个,就两人成为couple的可能性就很低,符合老师的要求。现在要求从n个人中,选出人数最多,且成为couple的可能性低。
思路:反建图法:任意两个人,如果以上4个条件都不满足,说明成为couple的可能性很高,不符合老师的要求。给他们连上一条边,图建好后,求出最大独立集。而最大独立集的定义是:一个点集,任意点之间不相邻(没边),且数量最多。而没边说明就是有边的反义(取反),也即成为couple的可能性很低。
最大独立集=n-最大基数匹配
#include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; const int maxn = 501; struct P { int h; char s; char style[100]; char f[100]; }p[501]; int vis[501],match[501]; struct edge { int from,to; }; vector<edge> edges; vector<int> g[maxn]; void addedge(int from,int to) { edges.push_back(edge{from,to}); edges.push_back(edge{to,from}); int m=edges.size(); g[from].push_back(m-2); g[to].push_back(m-1); } bool dfs(int u)//找增广路 { for(int i=0;i<g[u].size();i++) { int v=edges[g[u][i]].to;// if(!vis[v]) { vis[v]=1;// if(match[v]==-1||dfs(match[v])) { match[v]=u;// match[u]=v;// return 1; } } } return 0; } int Hungarain(int n) { int ans=0; memset(match,-1,sizeof(match)); for(int i=0;i<n;i++) { if(match[i]==-1)// { memset(vis,0,sizeof(vis)); if(dfs(i))ans++; } } return ans; } bool check(int i,int j) { if(abs(p[i].h-p[j].h)>40)return 0; if(strcmp(p[i].style,p[j].style)) return 0;//1不等 if(!strcmp(p[i].f,p[j].f))return 0;//0相等 if(p[i].s==p[j].s)return 0; return 1; } int main() { int t; // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); scanf("%d",&t); while(t--) { int n; scanf("%d",&n); edges.clear(); for(int i=0;i<n;i++)g[i].clear(); for(int i=0;i<n;i++) scanf("%d %c%s%s",&p[i].h,&p[i].s,&p[i].style,&p[i].f); for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { // if(abs(p[i].h-p[j].h)<=40&& // strcmp(p[i].style,p[j].style)==0&&//相等为0 // strcmp(p[i].f,p[j].f)&& // p[i].s!=p[j].s) if(check(i,j)) addedge(i,j); } } int temp=Hungarain(n); int ans=n-temp; printf("%d\n",ans); } }
相关文章推荐
- POJ 2771 Guardian of Decency (二分图最大点独立集)
- POJ 2771 Guardian of Decency(二分图最大独立集)
- POJ-2771-Guardian of Decency-求二分图最大独立集(匈牙利算法)
- POJ 2771 Guardian of Decency (二分图的最大独立集)
- POJ 2771 Guardian of Decency(二分图最大独立集)
- 【二分图+最大独立集】北大 poj 2771 Guardian of Decency
- POJ 2771 Guardian of Decency【二分图最大独立集】
- POJ 2771 Guardian of Decency(二分图最大独立集)
- POJ 2771 Guardian of Decency(求最大点独立集)
- POJ 2771 Guardian of Decency (最大独立集Hungary)
- 【POJ】2771 Guardian of Decency 最大独立集
- poj 2771 Guardian of Decency(最大独立集)
- POJ 2771 Guardian of Decency 最大独立集
- poj 2771 Guardian of Decency----二分图求 最大覆盖集
- poj 2771 Guardian of Decency【最大点独立集】
- poj 2771 Guardian of Decency 最大独立集
- POJ 2771 Guardian of Decency最大独立集
- poj2771——Guardian of Decency——————【最大独立集、最大匹配扩展】
- POJ 2771 Guardian of Decency(最大独立集、二分图匹配)
- UVALive 3415 Guardian of Decency(二分图的最大独立集)