• 【vijos】【BFS+hash】毒药?解药?


    描述

    羽毛笔和im是抽签到同一个考场的,她们突然闻到一阵刺鼻的化学试剂的气味。
    机灵鼠:(头都不抬)你们是考生么?还在门口磨蹭什么?快进来帮我忙!!……怎么还不进来?你们拖赛,拖赛,把你们的青春都拖掉赛……
    im:开…开策了>_<
    羽毛笔:哎呀~~机灵鼠大人要我们帮什么忙?^^
    机灵鼠:你们看这里的这些药,都是我研制的对付各种症状的解药。可是我一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别的病症……(im:那…那是解药还是毒药啊?!)……经过我天才的努力(背景:我是天才!!),终于弄清了每种药的具体性能(路人甲:那是你自己配的吗?-_-),我会把每种药能治的病症和能使人患上的病症列一张清单给你们,然后你们要根据这张清单找出能治愈所有病症的最少药剂组合……顺便说一声,病症的数目不超过10种(小呆:偶是好人吧^^),我的药是用不完的,就是说每种药剂都可以被重复使用。给你们的单子里第一行是病症的总数n,第二行是药剂的种类m,以下有m行,每行有n个数字用空格隔开,文件的第i+2行的n个数字中,如果第j个数为1,就表示第i种药可以治愈病症j(如果患有这种病的话则治愈,没有这种病则无影响),如果为0表示无影响,如果为-1表示反而能使人得上这种病(无病患上,有病无影响)。我制的药任何两种性能都不同。你们只要给我用的最少的药剂数就可以了。

    代码

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <map>
    #define INF 1000000000
    using namespace std;
    
    int n,m,med[120][13],cnt=0;
    bool flag=0,ha[1200],have_ans=0;
    
    struct s{
        bool ill[13];
        int level;
    };
    
    void bfs(){
        s start;
        for(int i=1;i<=n;i++) start.ill[i]=1;
        start.level=0;
        queue<s> q;
        q.push(start);
        while(!q.empty()&&!have_ans){
            s cur=q.front(); q.pop();
            s bak=cur;
            for(int i=1;i<=m;i++){
                for(int j=1;j<=n;j++){
                    if(cur.ill[j]==0&&med[i][j]==-1) cur.ill[j]=1;
                    else if(cur.ill[j]==1&&med[i][j]==1) cur.ill[j]=0;
                }
                int h=0;
                for(int i=1;i<=n;i++)
                if(cur.ill[i]==1){
                    flag=1; h+=(1<<(i-1));
                }
                if(!flag) {
                    have_ans=1; cnt=cur.level+1; break;
                }
                else if(!ha[h]) {
                    cur.level+=1; cnt=cur.level; q.push(cur);
                }
                cur=bak; flag=0; ha[h]=1;
            }
        }
    }
    
    int main(){
        memset(ha,0,sizeof(ha));
        scanf("%d",&n); scanf("%d",&m);
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++) scanf("%d",&med[i][j]);
        bfs();
        if(have_ans) printf("%d",cnt);
        else puts("The patient will be dead.");
        return 0;
    }
  • 相关阅读:
    MySQL字段数据全部查出【只保留中文、英文、数字、空格的词表】
    MySQL查看当前运行的事务和执行的账户
    【转】【MySQL报错】ERROR 1558 (HY000): Column count of mysql.user is wrong. Expected 43, found 39.
    【转】mysqldump的锁表的问题
    mysql 通过echo的方式写入数据库 中文乱码解决方案
    Python3.5爬取豆瓣电视剧数据并且同步到mysql中
    Python3.5爬取cbooo.cn数据并且同步到mysql中
    【转&参考】MySQL利用frm和ibd文件进行数据恢复
    [算法]从一道题引出variable-precision SWAR算法
    [转]nginx负载均衡的五种算法
  • 原文地址:https://www.cnblogs.com/leotan0321/p/6081377.html
Copyright © 2020-2023  润新知