HDU3829 Cat VS Dog 最大独立集

第一次做最大独立集的题。。二分图最大独立集=顶点数-最大匹配数

这道题用独立集真的是想不到QAQ...我好菜啊啊啊啊55555...

附上参考博客Orz:https://blog.csdn.net/niushuai666/article/details/7076116

看过后才发现,之前一直用的加两次边最后再除2的方法叫做“拆点”

这道题和上一道最小点覆盖的题刚好相反,邻接表TLE了,邻接矩阵过了。。难道是因为图比较稠密?emmmmm...

可是自认为写的和大佬博客差不多,但就是一直卡。。最近总是遇到玄学事情。。心情复杂.jpg

另外,,C++的string类是真的好用啊2333

附上AC代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int MAXN=505;
int n1,n2,k;
int g[MAXN][MAXN];
int link[MAXN];
bool vis[MAXN];

bool dfs(int u)
{
    for(int v=0;v<n2;v++)
        if(g[u][v]&&!vis[v])
        {
            vis[v]=true;
            if(link[v]==-1||dfs(link[v]))
            {
                link[v]=u;
                return true;
            }
        }
    return false;
}
int hungry()
{
    int ans=0;
    memset(link,-1,sizeof(link));
    for(int u=0;u<n1;u++)
    {
        memset(vis,false,sizeof(vis));
        if(dfs(u))
            ans++;
    }
    return ans;
}
int n,m,p;
string li[MAXN],dis[MAXN];
string like,dislike;
int main()
{
    while(scanf("%d%d%d",&n,&m,&p)!=EOF)
    {
        //memset(e,0,sizeof(e));
        for(int i=0;i<p;i++)
        {
            cin>>like>>dislike;
            li[i]=like;dis[i]=dislike;
        }
        memset(g,0,sizeof(g));
        for(int i=0;i<p;i++)
            for(int j=0;j<p;j++)
            {
                if((li[i]==dis[j])||(dis[i]==li[j]))
                    g[i][j]=1;
            }
        n1=n2=p;
        int ans=hungry();
        printf("%d\n",p-ans/2);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Cc_Sonia/article/details/81948678
Dog