正题
大意
给一个无向图,求最少需要多少条路径可以连接所有点。
解题思路
一个公式就好了
最小路径覆盖数=最大匹配数
代码
#include<cstdio>
#include<cstring>
using namespace std;
struct line{int x,y,next;
}a[1000];
int link[121],n,m,ls[121],xx,yy,s,t;
bool cover[121];
bool find(int x)/求最大匹配
{int p=0;for (int q=ls[x];q;q=a[q].next){if (!cover[a[q].y]){p=link[a[q].y];link[a[q].y]=x;cover[a[q].y]=true;if (!p || find(p)) return true;link[a[q].y]=p;}}return false;
}
int main()
{scanf("%d",&t);for (int ti=1;ti<=t;ti++){memset(link,0,sizeof(link));memset(ls,0,sizeof(ls));scanf("%d%d",&n,&m);s=0;for (int i=1;i<=m;i++){scanf("%d%d",&yy,&xx);a[i].x=xx;a[i].y=yy;a[i].next=ls[xx];ls[xx]=i;}for (int i=1;i<=n;i++){memset(cover,false,sizeof(cover));if (find(i)) s++;}printf("%d\n",n-s);}
}