hdu 1498

来源:互联网 发布:淘宝卖家寄寿衣怎么办 编辑:程序博客网 时间:2024/06/01 19:43
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define N 200int mark[N],map[N][N],link[N],n,hash[N],b[N],color[N];int find(int k,int u){int i;for(i=1;i<=n;i++){if(!mark[i]&&map[k][i]==u){mark[i]=1;if(!link[i]||find(link[i],u)){link[i]=k;return 1;}}}return 0;}int main(){int m,i,j,k,count,sum;while(scanf("%d%d",&n,&m),n||m){k=0;memset(hash,0,sizeof(hash));memset(color,0,sizeof(color));for(i=1;i<=n;i++)for(j=1;j<=n;j++){scanf("%d",&map[i][j]);if(!hash[map[i][j]]){color[k++]=map[i][j];hash[map[i][j]]=1;}}count=0;for(i=0;i<k;i++){memset(link,0,sizeof(link));sum=0;for(j=1;j<=n;j++){memset(mark,0,sizeof(mark));sum+=find(j,color[i]);}if(sum>m)b[count++]=color[i];}if(count==0)printf("-1\n");else{sort(b,b+count);for(i=0;i<count-1;i++)printf("%d ",b[i]);printf("%d\n",b[count-1]);}}return 0;}大家可以先做一下hdu 2119,每次只能删除一行或一列的1,求的是最少多少次能把1删除完,以行为一个子集,列为一个子集,如果map[i][j]=1就是i与j建一条边,把1删除完,就是每条边都要被删除,就是最小点覆盖问题,这一题也是每次只能消除一行或一列的相同颜色的气球,要求出删除每一种颜色的气球最少需要多少次,如果大于k的话就不能删除完,要求的就是不能被删除完的。每一种气球就相当于hdu 2119的1,也是求最小点覆盖。

0 0
原创粉丝点击