题意:给出点数,和边数,还有有向的连通方式,求最小路径覆盖数。大概就是这意思,自己读题没太理解。开始看最小路径覆盖有什么“可重点”,“环”什么的。。这道题我看是有可重点和环啊。。。但是直接做也AC,感觉没啥大区别。
#include<iostream>
using namespace std;
bool g[125][125],vis[125];
int n,m;
int link[125];
bool dfs(int u)
{
int v;
for(v=1;v<=n;v++)
{
if(g[u][v]&&!vis[v])
{
vis[v]=1;
if(link[v]==-1||dfs(link[v]))
{
link[v]=u;
return true;
}
}
}
return false;
}
int maxmatch()
{
int u,num=0;
memset(link,-1,sizeof(link));
for(u=1;u<=n;u++)
{
memset(vis,0,sizeof(vis));
if(dfs(u)) num++;
}
return num;
}
int main()
{
int N,a,b;
scanf("%d",&N);
while(N--)
{
scanf("%d %d",&n,&m);
memset(g,0,sizeof(g));
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
g[a][b]=1;
//printf(" i=%d,m=%d\n",i,m);
}
printf("%d\n",n-maxmatch());
}
}