NOIP1996挖地雷
题目背景
NOIp1996提高组第三题
题目描述
在一个地图上有NN个地窖(N \le 20)(N≤20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。
输入输出格式
输入格式:
有若干行。
第11行只有一个数字,表示地窖的个数NN。
第22行有NN个数,分别表示每个地窖中的地雷个数。
第33行至第N+1N+1行表示地窖之间的连接情况:
第33行有n-1n−1个数(00或11),表示第一个地窖至第22个、第33个、…、第nn个地窖有否路径连接。如第33行为1 1 0 0 0 … 011000…0,则表示第11个地窖至第22个地窖有路径,至第33个地窖有路径,至第44个地窖、第55个、…、第nn个地窖没有路径。
第44行有n-2n−2个数,表示第二个地窖至第33个、第44个、…、第nn个地窖有否路径连接。
… …
第n+1n+1行有11个数,表示第n-1n−1个地窖至第nn个地窖有否路径连接。(为00表示没有路径,为11表示有路径)。
输出格式:
有两行
第一行表示挖得最多地雷时的挖地雷的顺序,各地窖序号间以一个空格分隔,不得有多余的空格。
第二行只有一个数,表示能挖到的最多地雷数。
输入输出样例
输出样例#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; }
蒟蒻总是更懂你✿✿ヽ(°▽°)ノ✿