UVA 10615 Rooks

题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=11&page=show_problem&problem=1556

题意:一个NXN棋盘,车管理横纵两条线,在任何一个车管理的区域都不能放与自己相同的颜色车。求最少可以用几种颜色涂车,使车两两之间不发生冲突,输出填色一组情况即可。

分析:

二分图匹配,

S (0< S < 10)

N(0 ≤ N ≤ 100)

构建二分图

1)对于二分图染色,染色种数总是等于每一行或每一列的棋子数

2)建边,使其构造成k阶正则二分图,正则二分图必有完备匹配

3)对每一种颜色,匹配出可以涂相同颜色的,然后涂上颜色,并删除这个点(此点已经涂了颜色,匹配了)

#include
#include
#include
#include
#include
#include

using namespace std;
const int maxn = 110;
char s[maxn][maxn];
vector g[maxn];
int  num[maxn][maxn],fg[maxn],link[maxn];
bool flag[maxn];
int n;
int rook;
void read()
{
    scanf("%d",&n);
    memset(s,0,sizeof(s));
    memset(num,0,sizeof(num));
    memset(fg,0,sizeof(fg));
    rook = 0;
    int ans ;
    for(int i = 0;i= 0 ; --j)
            if (s[j][i]=='*') ans++;
        rook = max(rook,ans);
    }
    for(int i=0;i


你可能感兴趣的:(图论:二分图)