农夫约翰有一个农场,他把上面分成了n×m个格子,每个格子里养了一头牛。 但是有p对相邻格子(有共同边的格子)的牛是敌对关系,喜欢打架,约翰想做一些栅栏把他们分开。 所有的栅栏都是沿着边线的,横的或者竖的,每条栅栏都是贯穿整个横边或者竖边的。 但是约翰的预算有限,他想知道最多建k条栅栏使得尽可能减少打架的牛的对数。 比如下图中,相同的字符表示会相互打架的牛,我们可以建3条栅栏(红线),使得所有敌对关系的牛都隔离开。
cow
输入
第一行是一个整数T(1≤T≤400),表示样例的个数。 每个样例的第一行是4个整数n(1≤n≤100),m(1≤m≤100),p(1≤p≤2nm−n−m),k(1≤k≤max(1,n+m−2))。 以后的p行,每行4个整数x1,y1,x2,y2(1≤x1,x2≤m;1≤y1,y2≤n),表示(x1,y1)与(x2,y2)的牛需要分开。输入保证没有重复信息并且输入的都是相邻格。
输出
每行输出一个样例的结果,输出在建立k条栅栏的情况下,还会打架的牛的对数。如果可以完全分隔开牛,那么还需要输出需要建立的最少的栅栏数。
样例输入
2
5 5 3 4
1 2 2 2
2 3 3 3
2 4 2 5
5 5 3 1
1 2 2 2
2 3 3 3
2 4 2 5
样例输出
0 3
2
我的代码:
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *p1,const void *p2){
return *(int *)p1-*(int *)p2;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
int a[110]={0};
int b[110]={0};
int c[220]={0};
int n,m,p,k;
int ans=0;
scanf("%d %d %d %d",&n,&m,&p,&k);
int x1,y1,x2,y2;
for(int i=0;i<p;i++){
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
if(x1==x2){
if(y1<y2) b[y1]++;
if(y2<y1) b[y2]++;
}
if(y1==y2){
if(x1<x2) a[x1]++;
if(x2<x1) a[x2]++;
}
}
for(int i=1;i<n;i++){
if(a[i]!=0) ans++;
}
for(int j=1;j<m;j++){
if(b[j]!=0) ans++;
}
if(ans<=k) printf("0 %d\n",ans);
else{
int cnt=0;
for(int i=1;i<n;i++){
if(a[i]!=0) c[cnt++]=a[i];
}
for(int i=1;i<m;i++){
if(b[i]!=0) c[cnt++]=b[i];
}
qsort(c,cnt,sizeof(c[0]),cmp);
int sum=0;
for(int i=0;i<ans-k;i++){
sum+=c[i];
}
printf("%d\n",sum);
}
}
return 0;
}
- [](
```
_**
```c
```**_
```)