hdu 1498 50 years, 50 colors
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2717 Accepted Submission(s):
1551
On Octorber 21st, HDU 50-year-celebration, 50-color balloons floating around the campus, it's so nice, isn't it? To celebrate this meaningful day, the ACM team of HDU hold some fuuny games. Especially, there will be a game named "crashing color balloons".
There will be a n*n matrix board on the ground, and each
grid will have a color balloon in it.And the color of the ballon will be in the
range of [1, 50].After the referee shouts "go!",you can begin to crash the
balloons.Every time you can only choose one kind of balloon to crash, we define
that the two balloons with the same color belong to the same kind.What's more,
each time you can only choose a single row or column of balloon, and crash the
balloons that with the color you had chosen. Of course, a lot of students are
waiting to play this game, so we just give every student k times to crash the
balloons.
Here comes the problem: which kind of balloon is impossible to
be all crashed by a student in k times.
#include <algorithm> #include <cstring> #include <cstdio> #define N 105 using namespace std; bool vis[N],used[N]; int G[N][N],a[N][N],n,K,f[N],ans[N],sum; inline int init() { sum=0; memset(vis,0,sizeof(vis)); } bool dfs(int x) { for(int i=1;i<=n;++i) { if(!used[i]&&G[x][i]) { used[i]=1; if(f[i]==-1||dfs(f[i])) { f[i]=x; return 1; } } } return 0; } int check() { int num=0; memset(f,-1,sizeof(f)); for(int i=1;i<=n;++i) { memset(used,0,sizeof(used)); if(dfs(i)) num++; } return num; } int Main() { for(;scanf("%d%d",&n,&K)&&n&&K;) { init(); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) scanf("%d",&a[i][j]); for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { if(vis[a[i][j]]) continue; vis[a[i][j]]=1; memset(G,0,sizeof(G)); for(int k=1;k<=n;++k) for(int l=1;l<=n;++l) if(a[k][l]==a[i][j]) G[k][l]=1; if(check()>K) ans[++sum]=a[i][j]; } } if(!sum) {printf("-1\n");continue;} sort(ans+1,ans+1+sum); for(int i=1;i<sum;++i) printf("%d ",ans[i]); printf("%d\n",ans[sum]); } return 0; } int sb=Main(); int main(int argc,char *argv[]){;}