| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 6908 | Accepted: 4114 |
Description
Input
Output
Sample Input
2 4 3 3 4 1 3 2 3 3 3 1 3 1 2 2 3
Sample Output
2 1
Source
最小路径覆盖等于 顶点个数减去 最大匹配
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
int tt,n,m,mark[610],link[610],g[610][610];
bool dfs(int t)
{
for(int i=1;i<=n;i++)
{
if(mark[i]==-1&&g[t][i])
{
mark[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=t;
return true;
}
}
}
return false;
}
int main()
{
scanf("%d",&tt);
while(tt--)
{
int ans=0;
memset(g,0,sizeof(g));
memset(link,-1,sizeof(link));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
g[x][y]=1;
}
for(int i=1;i<=n;i++)
{
memset(mark,-1,sizeof(mark));
if(dfs(i))
ans++;
}
printf("%d\n",n-ans);
}
return 0;
}
原文:http://www.cnblogs.com/a972290869/p/4248948.html