思路:因为不知道谁是男的女的,所以都放一块 这样就形成了无向的二分图 所以最大独立集 = n - 最大匹配/2;
边表(4XXMS)实现 比矩阵(38XXMS)快多了
#include <stdio.h>
#include <string.h>
#define VM 505
#define EM 10000
struct E
{
v,next;
}edge[EM];
int head[VM],link[VM],vis[VM],xM[VM];
int p,n;
void addedge (int cu,int cv)
{
cv;
= head[cu];
++;
}
int DFS (int u)
{
head[u];i != -1;i = edge[i].next)
v = edge[i].v;
if (!vis[v])
{
vis[v] = 1;
if(link[v] == -1||DFS(link[v]))
{
link[v] = u;
xM[u] = v;
return 1;
}
}
0;
}
int gunary ()
{
0;
(link,-1,sizeof(link));
(xM,-1,sizeof(xM));
//加个数组优化,发现时间没少啊!!!
< n;u ++)
if (xM[u] == -1)
{
memset (vis,0,sizeof(vis));
if (DFS(u))
res ++;
}
res;
}
int main ()
{
u,v,m;
(~scanf
("%d",&n))
//这个取反高明 学来的