uva 10615 二分图匹配 每个点上的不同边必须染上不同颜色 求最小染色数

来源:互联网 发布:安装双系统win7和linux 编辑:程序博客网 时间:2024/04/25 08:07
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int xx[160],vis[160],g[160][160],d1[160],d2[160],n,res[160][160];char s[160][160];int match(int u){for(int i=1;i<=n;i++){if(!vis[i] && g[u][i]){vis[i]=1;if(!xx[i] || match(xx[i])){xx[i]=u;return 1;}}}return 0;}void solve(int c){memset(xx,0,sizeof(xx));for(int i=1;i<=n;i++){memset(vis,0,sizeof(vis));match(i);}for(int i=1;i<=n;i++){if(xx[i]){int u=xx[i];if(s[u][i]=='*'&&!res[u][i])res[u][i]=c;g[u][i]--;}}}int main(){int T;scanf("%d",&T);while(T--){memset(d1,0,sizeof(d1));memset(d2,0,sizeof(d2));memset(g,0,sizeof(g));scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%s",s[i]+1);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(s[i][j]=='*'){d1[i]++;d2[j]++;g[i][j]++;}}}int tm=0;for(int i=1;i<=n;i++){tm=max(tm,max(d1[i],d2[i]));}printf("%d\n",tm);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){while(d1[i]<tm && d2[j]<tm){d1[i]++;d2[j]++;g[i][j]++;}}}memset(res,0,sizeof(res));for(int i=1;i<=n;i++)solve(i);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)printf("%d%c",res[i][j],j==n?'\n':' ');}}}

阅读全文
0 0