给出几个交叉路口以及路口之间的道路,求出最少的路径数可以覆盖到所有的点....由定理可知道,最少路径覆盖数=n-最大匹配数
直接套匈牙利模版,直接水过.
#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()); } }