pku 1691 Painting A Board DFS 抽象建图 + 拓扑排序

http://poj.org/problem?id=1691

题意:

给定一个大矩形,然后给出n个需要染色的小矩形的左上角的坐标,右下角的坐标以及该矩形要染得颜色,每个颜色对应的一把刷子。问将这些小矩形染完规定的颜色之后需要最少的刷子数。

要求:只当该小矩形的上边的矩形都染完色之后,该矩形才能染色,如果同一个刷子被使用多次也要计算进来;

思路:

首先根据一个矩形的所有上部分染完之后才能染色建立关系图,然后根据拓扑排序的理论,找入度为0的点开始染色,(因为入度为0 表明其上部的所有矩形都已经染色),dfs所有点求最小值。


注意这里画的边只是统计度数用的,而我们真正用来描述可行的边是根据经过该点之后的剩余点里面的入度为0的点时接下来要访问的点:

View Code
#include <cstdio>
#include <cstring>
#define maxn 17
using namespace std;

const int inf = 0x7fffffff;

struct node
{
    int lx,ly;
    int rx,ry;
    int col;
}p[maxn];
int map[maxn][maxn],deg[maxn];
bool vt[maxn];
int ans,n;

void Buildmap()
{
    int i,j;
    memset(deg,0,sizeof(deg));
    memset(map,0,sizeof(map));
    for (i = 0; i < n; ++i)
    {
        for (j = 0; j < n; ++j)
        {
            if (i != j && p[j].ly == p[i].ry && !(p[j].rx < p[i].lx || p[j].lx > p[i].rx))//建图的关键
            {
                map[i][j] = 1;
                deg[j]++;
            }
        }
    }
}
void dfs(int dep,int col,int sum)
{
    int i,j;
    if (sum > ans) return ;
    if (dep == n)
    {
        if (sum < ans) ans = sum;
        return ;
    }
    for (i = 0; i < n; ++i)
    {
        if (!vt[i] && deg[i] == 0)//每次去入度为0的点
        {
            vt[i] = true;
            for (j = 0; j < n; ++j)
            {
                if (map[i][j]) deg[j]--;
            }
            if (p[i].col == col) dfs(dep + 1,col,sum);
            else dfs(dep + 1,p[i].col,sum + 1);
            vt[i] = false;
            for (j = 0; j < n; ++j)
            {
                if (map[i][j]) deg[j]++;
            }
        }
    }
}
int main()
{
    //freopen("d.txt","r",stdin);
    int i,t;
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d",&n);
        for (i = 0; i < n; ++i)
        scanf("%d%d%d%d%d",&p[i].ly,&p[i].lx,&p[i].ry,&p[i].rx,&p[i].col);
        ans = inf;
        Buildmap();
        memset(vt,false,sizeof(vt));
        dfs(0,0,0);
        printf("%d\n",ans);
    }
    return 0;
}

 

 

weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值