程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 2768

hdu 2768

編輯:C++入門知識

求最大留下的觀眾,觀眾之間存在不能同時滿足的關系,就是矛盾關系,

矛盾關系建邊,建邊是雙向的所以最大匹配要/2

 


還有一種建圖的方法:把觀眾分成兩個集合,一個是投留下貓的,一個是投留下狗的

每個集合間沒有矛盾關系,就是二分圖了,求出最大匹配,

 


兩種方法都是要求最大獨立集

 

 

 

 

#include<stdio.h>
#include<string.h>
#define N 510
int map[N][N],n,m,k,match[N],vis[N];
struct op
{
    int love,hate;
}p[N];
int find(int x)
{
    for(int i=1;i<=n;i++)
    {
        if(vis[i]==0&&map[x][i]==1)
        {
            vis[i]=1;
            if(match[i]==-1||find(match[i])==1)
            {
                match[i]=x;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int i,j,sum,t,k;
    int a[2];
    char str[3];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&m,&k,&n);
        for(i=1;i<=n;i++)
        {
            for(j=0;j<2;j++)
            {
                scanf("%s",str);
                a[j]=0;
                if(str[0]=='D')
                {
                    for(k=1;str[k];k++)
                        a[j]=a[j]*10+str[k]-'0';
                    a[j]+=m;
                }
                else if(str[0]=='C')
                    for(k=1;str[k];k++)
                        a[j]=a[j]*10+str[k]-'0';
            }
            p[i].love=a[0];
            p[i].hate=a[1];
        }
        memset(map,0,sizeof(map));
        memset(match,-1,sizeof(match));
        sum=0;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<i;j++)
                if(p[i].love==p[j].hate||p[i].hate==p[j].love)
                    map[i][j]=map[j][i]=1;
        }
        for(i=1;i<=n;i++)
        {
            memset(vis,0,sizeof(vis));
            sum+=find(i);
        }
        //printf("%d\n",sum);
        printf("%d\n",n-sum/2);
    }
    return 0;
}
#include<stdio.h>
#include<string.h>
#define N 510
int map[N][N],n,m,k,match[N],vis[N],num1,num0;
struct op
{
    int cat,dog;
}p[2][N];
int find(int x)
{
    for(int i=1;i<num1;i++)
    {
        if(vis[i]==0&&map[x][i]==1)
        {
            vis[i]=1;
            if(match[i]==-1||find(match[i])==1)
            {
                match[i]=x;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int i,j,sum,t,k;
    char str[10];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&m,&k,&n);
        num1=num0=1;
        for(j=1;j<=n;j++)
        {
             scanf("%s",str);
             if(str[0]=='D')
             {
                 p[1][num1].dog=0;
                 for(i=1;str[i];i++)
                     p[1][num1].dog=p[1][num1].dog*10+str[i]-'0';
                 scanf("%s",str);
                 p[1][num1].cat=0;
                 for(i=1;str[i];i++)
                     p[1][num1].cat=p[1][num1].cat*10+str[i]-'0';
                 num1++;//選擇留下狗的觀眾人數
             }
             else
             {
                 p[0][num0].cat=0;
                 for(i=1;str[i];i++)
                     p[0][num0].cat=p[0][num0].cat*10+str[i]-'0';
                 scanf("%s",str);
                 p[0][num0].dog=0;
                 for(i=1;str[i];i++)
                     p[0][num0].dog=p[0][num0].dog*10+str[i]-'0';                 
                 num0++;//選擇留下貓的觀眾人數
             }
        }
        memset(map,0,sizeof(map));
        memset(match,-1,sizeof(match));
        sum=0;
        for(i=1;i<num0;i++)
        {
            for(j=1;j<num1;j++)
                if(p[0][i].cat==p[1][j].cat||p[0][i].dog==p[1][j].dog)
                    map[i][j]=1;
        }
        for(i=1;i<num0;i++)
        {
            memset(vis,0,sizeof(vis));
            sum+=find(i);
        }
        //printf("%d\n",sum);
        printf("%d\n",n-sum);
    }
    return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved