UVALive 5962 Strongly Connected Chemicals --最大独立集

题意:给n个阳离子和m个阴离子,并给出相互的吸引关系,求一个最大的点集,使其中的每个阴阳离子相互吸引。

解法:枚举每条边,使该条边存在,然后建立反图,求一个最大匹配,此时的点数减去最大匹配与ans求一个最大值即可。

代码:

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <algorithm>

#include <stack>

using namespace std;

#define N 207



int G[N][N],G2[N][N];

int match[N];

int vis[N];

char ss[N][N];

int n,m;



int Search_Path(int s)

{

    for(int v=0;v<m;v++)

    {

        if(G[s][v] == 0)

            continue;

        if(!vis[v])

        {

            vis[v] = 1;

            if(match[v] == -1 || Search_Path(match[v]))

            {

                match[v] = s;

                return 1;

            }

        }

    }

    return 0;

}



int Max_match()

{

    memset(match,-1,sizeof(match));

    int cnt = 0;

    for(int i=0;i<n;i++)

    {

        memset(vis,0,sizeof(vis));

        if(Search_Path(i))

            cnt++;

    }

    return cnt;

}



int main()

{

    int t,cs = 1,i,j,k,h;

    scanf("%d",&t);

    while(t--)

    {

        scanf("%d%d",&n,&m);

        for(i=0;i<n;i++)

        {

            scanf("%s",ss[i]);

            for(j=0;j<m;j++)

                G[i][j] = ss[i][j] - '0';

        }

        int ans = 0;

        for(i=0;i<n;i++)  //枚举边

        {

            for(j=0;j<m;j++)

            {

                if(G[i][j])

                {

                    int cntn = 0;

                    int cntm = 0;

                    for(k=0;k<n;k++)

                        if(G[k][j])

                            cntn++;

                    for(h=0;h<m;h++)

                        if(G[i][h])

                            cntm++;

                    for(k=0;k<n;k++)

                    {

                        for(h=0;h<m;h++)

                        {

                            if(G[k][j]&&G[i][h])

                                G2[k][h] = 1-G[k][h];

                            else

                                G2[k][h] = 0;

                        }

                    }

                    ans = max(ans,cntn+cntm-Max_match());

                }

            }

        }

        printf("Case %d: %d\n",cs++,ans);

    }

    return 0;

}
View Code

 

你可能感兴趣的:(connect)