HDU2470(Get-Together at Stockholm)
来源:互联网 发布:公司网络拓扑 编辑:程序博客网 时间:2024/04/29 00:32
/*****************************************************题意:Peter邀请朋友参加他的聚会;但是被邀请的人必须满足:在聚会中至少有A个认识的人和B个不认识的人;求最多有多少人会被他邀请;算法:根据题目给的数据量,目测这是一道水题;即通过循环查找找到不合法的结点,删除他对应的关系;然后继续查找,直到每一个结点都是合法的;*****************************************************/#include<iostream>#include<cstdio>#include<cmath>#include<cstring>using namespace std;const int N=111;struct relation{ int know,unknow;} a[N];int map[N][N];bool visit[N];int n,m;int A,B;int solve(){ int res=n; while(1) { int flag=1; for(int i = 0 ; i < n ; i++) { if(!visit[i]&&(a[i].know<A||a[i].unknow<B)) { visit[i]=1; res--; flag=0; for(int j=0; j<n; j++) { if(!visit[j]) { if(map[i][j]) { a[j].know--; } else a[j].unknow--; } } } } if(flag) break;//所有的结点全部满足条件 } return res;}int main(){ //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin); int tcase = 1; while(~scanf("%d%d%d%d",&n,&m,&A,&B)) { if(!n&&!m&&!A&&!B) break; memset(a,0,sizeof(a)); memset(map,0,sizeof(map)); memset(visit,0,sizeof(visit)); for(int i=0; i<m; i++) { int u , v; scanf("%d%d",&u,&v); map[u][v]=map[v][u]=1; a[u].know++; a[v].know++; } for(int i=0; i<n; i++) { a[i].unknow=n-a[i].know-1;//不认的人数=n-认识的和他自己 } printf("Case #%d: %d\n" , tcase++ , solve()); } return 0;}