HDU1151

/*最小路徑覆蓋數問題
最小路徑覆蓋=n(節點數)-最大匹配數*/
#include<stdio.h>
#include<string.h>
const int max=125;
int g[max][max];
bool use[max];
int link[max];
int uN,vN;
bool dfs(int u)
{
 int v;
 for(v=1;v<=vN;v++)
 {
  if(!use[v]&&g[u][v])
  {
   use[v]=true;
   if(link[v]==-1 || dfs(link[v]) )
   {
    link[v]=u;
    return true;
   }
  }
 }
 return false;
}
int hungary()
{
 int u,res=0;
 memset(link,-1,sizeof(link));
 for(u=1;u<=uN;u++)
 {
  memset(use,0,sizeof(use));
  if(dfs(u)) res++;
 }
 return res;
}
int main()
{
 int i,j,k,n,m;
 int T;
 scanf("%d",&T);
    while(T--)
 {
  memset(g,0,sizeof(g));
  scanf("%d%d",&n,&m);
  int ai,bi,di;
  for(i=1;i<=m;i++)
  {
   scanf("%d%d",&ai,&bi);
   g[ai][bi]=1;
  }
  uN=n; vN=n;
  printf("%d\n",n-hungary());
 }
 return 0;
}
發佈了41 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章