[匈牙利] Jzoj P1156 使命的召唤
题解
- 题目描述有问题!!!题目描述有问题!!!题目描述有问题!!!
- “任意两个敢死队员的路径不能重复”是指一个点只走一次
- 那么这样的话,也就是一个点只经过一次
- 这样的话,我们可以将一个点拆成两个点,入点和出点
- 那么就形成了一个二分图,在二分图上求最大匹配数
- 匈牙利即可
代码
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 int n,m,x[210],y[210],f[210][210],visit[210],l[210],ans; 7 bool xyl(int x) 8 { 9 for (int i=1;i<=n;i++) 10 if (f[x][i]==true&&visit[i]==0) 11 { 12 visit[i]=1; 13 if (l[i]==0||xyl(l[i])) 14 { 15 l[i]=x; 16 return true; 17 } 18 } 19 return false; 20 } 21 int main() 22 { 23 scanf("%d",&n); 24 for (int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]); 25 scanf("%d",&m); 26 for (int i=1;i<=m;i++) 27 { 28 int a,b; 29 scanf("%d%d",&a,&b); 30 if (x[a]>b[x]) f[b][a]=true; else f[a][b]=true; 31 } 32 ans=n; 33 for (int i=1;i<=n;i++) 34 { 35 memset(visit,0,sizeof(visit)); 36 if (xyl(i)) ans--; 37 } 38 printf("%d",ans); 39 return 0; 40 }