最小路径覆盖练习
裸的。
最大独立集 = 顶点个数– 最小顶点覆盖(最大匹配)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int _map[500][500];
int p,e,num;
int vis[1000],link[1000];
void floyd()
{
for(int k=0;k<p;k++)
{
for(int j=0;j<p;j++)
{
for(int i=0;i<p;i++)
{
if(_map[j][k]&&_map[k][i])
{
_map[j][i]=1;
}
}
}
}
}
int dfs(int k)
{
for(int i=0;i<p;i++)
{
if(_map[k][i]&&!vis[i])
{
vis[i]=1;
// printf("%d\n",link[i]);
if(link[i]==-1||dfs(link[i]))
{
// printf("i=%d\n",i);
link[i]=k;
return 1;
}
}
}
return 0;
}
void hungery()
{
for(int i=0;i<p;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
{
num++;
// printf("num=%d\n",num);
}
}
}
void init()
{
for(int i=0;i<p;i++)
{
vis[i]=0;
link[i]=-1;
// printf("link=%d",link[i]);
for(int j=0;j<p;j++)
{
_map[i][j]=0;
}
}
num=0;
}
int main()
{
// freopen("in","r",stdin);
int n;
cin>>n;
while(n--)
{
//printf("n=%d",n);
scanf("%d%d",&p,&e);
init();
for(int i=0;i<e;i++)
{
int x,y;
scanf("%d%d",&x,&y);
_map[x-1][y-1]=1;
}
// floyd();
hungery();
// printf("num=%d\n",num);
printf("%d\n",p-num);
}
return 0;
}