UVA 10615 Rooks(?)

来源:互联网 发布:皇甫圣华淘宝 编辑:程序博客网 时间:2024/05/29 02:47
这题是我碰到的二分图最难,到现在都还没明白怎么回事,先存着吧。
#include<iostream>#include<cstring>#include<vector>#include<algorithm>using namespace std;const int maxn=100+5;int n,maxcolor;int color[maxn][maxn],match[maxn],inrow[maxn],incol[maxn];char map[maxn][maxn];bool used[maxn];vector<int> G[maxn];void init(){    memset(inrow,0,sizeof(inrow));    memset(incol,0,sizeof(incol));    maxcolor=0;    scanf("%d",&n);    for(int i=1;i<=n;i++){        G[i].clear();        scanf("%s",map[i]+1);        for(int j=1;j<=n;j++){            if(map[i][j]=='*'){                inrow[i]++;incol[j]++;                G[i].push_back(j);            }        }    }    for(int i=1;i<=n;i++)        maxcolor=max(maxcolor,max(inrow[i],incol[i]));    for(int i=1;i<=n;i++) if(inrow[i]<maxcolor)        for(int j=1;j<=n&&inrow[i]<maxcolor;j++){            while(inrow[i]<maxcolor&&incol[j]<maxcolor){                inrow[i]++;                incol[j]++;                G[i].push_back(j);            }        } }bool find(int i){    for(int j=0;j<G[i].size();j++){        int v=G[i][j];        if(!used[v])        {            used[v]=true;            if(match[v]==-1||find(match[v]))            {                match[v]=i;                return true;            }        }    }    return false;}void solve(){    memset(color,0,sizeof(color));    int cnt=0;    while(cnt<maxcolor)    {        ++cnt;        memset(match,-1,sizeof(match));        for(int i=1;i<=n;i++){            memset(used,0,sizeof(used));            find(i);        }        for(int i=1;i<=n;i++){            int row=match[i];            if(map[row][i]=='*') color[row][i]=cnt;            for(int j=0;j<G[row].size();j++){                if(G[row][j]==i){                    G[row].erase(G[row].begin()+j);                    break;                }            }        }    }    printf("%d\n",maxcolor);    for(int i=1;i<=n;i++){        for(int j=1;j<=n;j++){            printf("%s%d",j==1?"":" ",color[i][j]);        }        printf("\n");    }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        init();        solve();    }    return 0;}

0 0