ssl1341-最小路径覆盖【最大匹配,最小路径覆盖,图论】

正题


大意

给一个无向图,求最少需要多少条路径可以连接所有点。


解题思路

一个公式就好了
最小路径覆盖数=最大匹配数


代码

#include
#include
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);
    }
}

转载于:https://www.cnblogs.com/sslwyc/p/8847847.html

你可能感兴趣的:(ssl1341-最小路径覆盖【最大匹配,最小路径覆盖,图论】)