zoukankan      html  css  js  c++  java
  • NOIP1996挖地雷

    题目背景

    NOIp1996提高组第三题

    题目描述

    在一个地图上有NN个地窖(N le 20)(N20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。

    输入输出格式

    输入格式:

    有若干行。

    11行只有一个数字,表示地窖的个数NN。

    22行有NN个数,分别表示每个地窖中的地雷个数。

    33行至第N+1N+1行表示地窖之间的连接情况:

    33行有n-1n1个数(00或11),表示第一个地窖至第22个、第33个、…、第nn个地窖有否路径连接。如第33行为1 1 0 0 0 … 0110000,则表示第11个地窖至第22个地窖有路径,至第33个地窖有路径,至第44个地窖、第55个、…、第nn个地窖没有路径。

    44行有n-2n2个数,表示第二个地窖至第33个、第44个、…、第nn个地窖有否路径连接。

    … …

    n+1n+1行有11个数,表示第n-1n1个地窖至第nn个地窖有否路径连接。(为00表示没有路径,为11表示有路径)。

    输出格式:

    有两行

    第一行表示挖得最多地雷时的挖地雷的顺序,各地窖序号间以一个空格分隔,不得有多余的空格。

    第二行只有一个数,表示能挖到的最多地雷数。

    输入输出样例

    输入样例#1: 
    5
    10 8 4 7 6
    1 1 1 0
    0 0 0
    1 1
    1
    
    输出样例#1: 
    1 3 4 5
    27

    很明显的无脑题,大力DFS就能过,总体而言没有什么难度
    要注意的是有向边,我好奇他下去之后怎么上来
    下面给出代码:
    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<algorithm>
    using namespace std;
    inline int min(int a,int b){return a<b?a:b;}
    inline int max(int a,int b){return a>b?a:b;}
    inline int rd(){
        int x=0,f=1;
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
        return x*f;
    }
    inline void write(int x){
         if(x<0) putchar('-'),x=-x;
         if(x>9) write(x/10);
         putchar(x%10+'0');
         return ;
    }
    int n;
    int v[10006];
    int head[10006],nxt[10006],to[10006];
    int total=0;
    int vis[10006];
    void add(int x,int y){
        total++;
        to[total]=y;
        nxt[total]=head[x];
        head[x]=total;
        return ;
    }
    int sum=0;
    int ans=0;
    int road[10006];
    int tot=0;
    int set[10006]; 
    void dfs(int x,int fa,int pos){
        int cnt=0;
        for(int e=head[x];e;e=nxt[e]){
            if(to[e]!=fa&&!vis[to[e]]){
                cnt++;
                sum+=v[to[e]];
                vis[to[e]]=1;
                set[pos]=to[e];
                dfs(to[e],x,pos+1);
                set[pos]=0;
                vis[to[e]]=0;
                sum-=v[to[e]];
            }
        }
        if(!cnt){
            if(sum>ans){
                ans=sum;
                tot=pos-1;
                memcpy(road,set,sizeof(set));
            }
            return ;
        }
    }
    int main(){
        n=rd();
        for(int i=1;i<=n;i++) v[i]=rd();
        for(int i=1;i<n;i++){
            for(int j=i+1;j<=n;j++){
                int x=rd();
                if(x) add(i,j);
            }
        }
        for(int i=1;i<=n;i++){
            sum=v[i];
            vis[i]=1;
            set[1]=i;
            dfs(i,0,2);
            vis[i]=0;
        }
        for(int i=1;i<tot;i++){
            write(road[i]);
            putchar(' ');
        }
        write(road[tot]);
        puts("");
        write(ans);
        return 0;
    }
    
    
    


    蒟蒻总是更懂你✿✿ヽ(°▽°)ノ✿
  • 相关阅读:
    idea添加类注释和方法注释
    蓝桥杯ALGO-1,区间k大数查询
    personalblog
    ul+li水平居中的几种方法
    前端ps部分
    帝国cms-tab
    帝国cms判断某一字段是否为空
    帝国cms建站总结-(分页)
    Js获取验证码倒计时
    前端截取字符串:JS截取字符串之substring、substr和slice详解
  • 原文地址:https://www.cnblogs.com/WWHHTT/p/9788575.html
Copyright © 2011-2022 走看看