NOIP1998提高组——挖地雷
【题目描述】:
挖地雷
思路:
水题一道。。
本来是拿来练习\(DAG\)上\(DP\)的,然后想了半天,一怒之下打了暴力A了\(233\)
NAIVE
因为起点不确定,所以应该枚举每一个点为起点,然后去\(dfs\),然后用前驱数组记录路径。。
然后我就觉得没说的了。。
//created by lajioj
#include<cstdio>
using namespace std;
int n;
const int MAXN = 25;
int a[MAXN];
struct edge{
int u,v,nxt;
}e[MAXN*MAXN];int head[MAXN];int cnt=0;bool vis[MAXN];int maxx = 0;int pre[MAXN];int rel[MAXN];int y = 0;
inline void add(int u,int v){
e[++cnt].u = u;e[cnt].v = v;e[cnt].nxt = head[u];head[u] = cnt;
}
inline void dfs(int u,int ans){
vis[u] = 1;
ans += a[u];
for(int i=head[u];i;i=e[i].nxt){
int v = e[i].v;
if(vis[v]) continue;
pre[v] = u;
dfs(v,ans);
vis[v] = 0;
}
if(ans > maxx){
maxx = ans;
y = 0;
rel[++y] = u;
for(int i=pre[u];i;i=pre[i]) rel[++y] = i;//这个才是真的路径数组,大则更新
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=n-1;++i){
for(int j=i+1;j<=n;++j){
int x;scanf("%d",&x);
if(x == 1) add(i,j);
}
}
for(int i=1;i<=n;++i) dfs(i,0);
for(int i=y;i>=1;--i) printf("%d ",rel[i]);puts("");printf("%d",maxx);
return 0;
}
\(lajioj\) \(is\) \(so\) \(NAIVE\)