Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1830 Accepted Submission(s): 1003
1 1 1 2 1 1 1 1 2 2 1 1 2 2 2 5 4 1 2 3 4 5 2 3 4 5 1 3 4 5 1 2 4 5 1 2 3 5 1 2 3 4 3 3 50 50 50 50 50 50 50 50 50 0 0
-1 1 2 1 2 3 4 5 -1
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<queue> #include<stack> #include<algorithm> using namespace std; int map[110][110],pipei[110],used[110]; int color[110][110]; int vis[51];//记录该颜色有没有出现 int n,k; int find(int x) { int i,j; for(i=1;i<=n;i++) { if(!used[i]&&map[x][i]) { used[i]=1; if(!pipei[i]||find(pipei[i])) { pipei[i]=x; return 1; } } } return 0; } int solve()//求最小路径覆盖 { int i; int sum=0; memset(pipei,0,sizeof(pipei)); for(i=1;i<=n;i++) { memset(used,0,sizeof(used)); sum+=find(i); } return sum; } int main() { int i,j; int col; int exist; while(scanf("%d%d",&n,&k)&&(n!=0||k!=0)) { memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&color[i][j]); vis[color[i][j]]=1;//该颜色出现 } } exist=0;//若全部颜色都不可以被消掉为0,否则为1 for(col=1;col<=50;col++)//枚举所有颜色 { if(vis[col])//该颜色出现过 { memset(map,0,sizeof(map));//每次初始化 for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(color[i][j]==col) { map[i][j]=1; } } } if(solve()>k)//该颜色不能在k次操作去掉 { exist++; if(exist>1) printf(" "); printf("%d",col); } } } if(!exist) printf("-1"); printf("\n"); } return 0; }
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<queue> #include<stack> #include<vector> #include<algorithm> using namespace std; vector<int >map[110]; int pipei[110],used[110]; int color[110][110]; int vis[51];//记录该颜色有没有出现 int n,k; int find(int x) { int i,j; int t; for(i=0;i<map[x].size();i++) { t=map[x][i]; if(!used[t]) { used[t]=1; if(!pipei[t]||find(pipei[t])) { pipei[t]=x; return 1; } } } return 0; } int solve()//求最小路径覆盖 { int i; int sum=0; memset(pipei,0,sizeof(pipei)); for(i=1;i<=n;i++) { memset(used,0,sizeof(used)); sum+=find(i); } return sum; } int main() { int i,j; int col; int exist; while(scanf("%d%d",&n,&k)&&(n!=0||k!=0)) { memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&color[i][j]); vis[color[i][j]]=1;//该颜色出现 } } exist=0;//若全部颜色都不可以被消掉为0,否则为1 for(col=1;col<=50;col++)//枚举所有颜色 { if(vis[col])//该颜色出现过 { for(i=1;i<=n;i++) { map[i].clear();//清空邻接表 for(j=1;j<=n;j++) { if(color[i][j]==col) { map[i].push_back(j); } } } if(solve()>k)//该颜色不能在k次操作去掉 { exist++; if(exist>1) printf(" "); printf("%d",col); } } } if(!exist) printf("-1"); printf("\n"); } return 0; }