您的位置:首页 > 其它

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-最大基数匹配

#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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: