转载请注明本文地址
继续了解了一些概念,比如最小路径覆盖什么的,但总觉得对这些东西现在理解的还不深刻
题意:有n个点,m条有向边,无环。求最少数量的路径,使所有点都被这些路径覆盖。
思路:
1.首先解释一些概念。
路径覆盖:在有向无环图中选一些路径,使之覆盖所有的点,并且每个顶点只能有一条边经过。
最小路径覆盖:所有上面所述路径中使路径数目最少。
2.有向无环图(DAG)中最小路径覆盖=顶点数 - 最大匹配数。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
const int MAXV=130;
bool map[MAXV][MAXV],vis[MAXV];
int match[MAXV];
int n,m;
void init()
{
memset(map,false,sizeof(map));
memset(match,-1,sizeof(match));
}
bool DFS(int u)
{
for(int v=0;v<n;v++)
{
if(map[u][v] && !vis[v])
{
vis[v]=true;
if(match[v]==-1 || DFS(match[v]))
{
match[v]=u;
return true;
}
}
}
return false;
}
int hungary()
{
int ans=0;
for(int u=0;u<n;u++)
{
memset(vis,false,sizeof(vis));
if(DFS(u)) ans++;
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
int u,v;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
u--,v--;
map[u][v]=true;
}
printf("%d\n",n-hungary());
}
return 0;
}