第一次做最大独立集的题。。二分图最大独立集=顶点数-最大匹配数
这道题用独立集真的是想不到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;
}