首页 > 代码库 > Bipartitegraph2594
Bipartitegraph2594
最小路径覆盖就是找出最小的路径条数(每个顶点只用一次),使图成为的一个路径覆盖.
最小路径覆盖数=节点数 - 最大匹配数
题意:不是赤裸裸的最小路径覆盖(走遍所有的点),正常的最小路径覆盖中两个人走的路径不能有重复的点,而本题可以重复。
分析:我们仍可将问题转化为最小路径覆盖。(通过传递闭包,在所有能最终连通的两个点上增加一条新边,从而使得中间被跳过的那些顶点可以被重复经过)。然后正常求最小路径覆盖即可。
#include <stdio.h>
#include <string.h>
#define N 301
int match[N],map[N][N];
int cn,mn;
bool used[N];
int find(int x)
{
for(int i=1;i<=cn;i++)
if(!used[i]&&map[x][i])
{
used[i]=true;
if(match[i]==-1||find(match[i]))
{
match[i]=x;
return true;
}
}
return false;
}
int Hungry()
{
int sum=0;
for(int i=1;i<=cn;i++)
{
memset(used,false,sizeof(used));
if(find(i))sum++;
}
return sum;
}
int main()
{
int num,st,ca;
scanf("%d",&ca);
while(ca--)
{
scanf("%d%d",&cn,&mn);
memset(map,0,sizeof(map));
memset(match,-1,sizeof(match));
for(int i=1;i<=mn;i++)
{
scanf("%d%d",&num,&st);
map[num][st]=1;
}
printf("%d\n",cn-Hungry());
}
}
Bipartitegraph2594