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;}

原创粉丝点击