首页 > 代码库 > UVALive 5962 Strongly Connected Chemicals --最大独立集

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 207int 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

 

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