标签:
解题报告
http://blog.csdn.net/juncoder/article/details/38159017
题意:
看到题目我就笑了,,,
老师认为这样的两个学生不是一对:
身高相差40以上(年龄都不是距离了,身高又算什么)
不同性别(sad,,,就不允许基友存在呀,,,谁的肥皂掉了,,,)
喜欢不一样的歌曲类型(你总不能要求两人整天听小苹果吧,,,,,,你是我的小丫小苹果,,,,,,)
喜欢一样的运动( they are likely to be fans of different teams and that would result in fighting......这是什么理由,喜欢同个不同球队还会打起来)
问最多的不在一起的有多少人
思路:
不在一起代表独立于相爱关系的,也就是求最大独立集,集合里面任意两个人都不相爱
最大独立集=结点数-最大匹配
ps不知道是不是写挫了,重写才过,sad。。。
#include <cmath> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct node { int h; char sex; char mus[110]; char spo[110]; }M[510],F[510]; int n,m,f,mmap[550][550],pre[550],vis[550]; int pd(int i,int j) { if( abs(M[i].h - F[j].h) > 40 ) return 0; if( strcmp(M[i].mus,F[j].mus) ) return 0; if( strcmp(M[i].spo,F[j].spo) == 0 ) return 0; return 1; } int dfs(int x) { for(int i=m+1;i<=m+f;i++){ if(!vis[i]&&mmap[x][i]){ vis[i]=1; if(pre[i]==-1||dfs(pre[i])){ pre[i]=x; return 1; } } } return 0; } int main() { int i,j,t,h; char str[100]; scanf("%d",&t); while(t--){ scanf("%d",&n); m=f=1; memset(mmap,0,sizeof(mmap)); memset(pre,-1,sizeof(pre)); memset(M,0,sizeof(M)); memset(F,0,sizeof(F)); for(i=1;i<=n;i++){ scanf("%d%s",&h,str); if(str[0]=='M'){ scanf("%s%s",M[m].mus,M[m].spo); M[m].h=h; M[m++].sex='M'; } else { scanf("%s%s",F[f].mus,F[f].spo); F[f].h=h; F[f++].sex='F'; } } for(i=1;i<=m;i++){ for(j=1;j<=f;j++){ if(pd(i,j)) mmap[i][m+j]=1; } } int ans=0; for(i=1;i<=m;i++){ memset(vis,0,sizeof(vis)); ans+=dfs(i); } printf("%d\n",n-ans); } }
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 4876 | Accepted: 2056 |
Description
Input
Output
Sample Input
2 4 35 M classicism programming 0 M baroque skiing 43 M baroque chess 30 F baroque soccer 8 27 M romance programming 194 F baroque programming 67 M baroque ping-pong 51 M classicism programming 80 M classicism Paintball 35 M baroque ping-pong 39 F romance ping-pong 110 M romance Paintball
Sample Output
3 7
POJ2771_Guardian of Decency(二分图/最大独立集=N-最大匹配)
标签:
原文地址:http://blog.csdn.net/juncoder/article/details/38159017