洛谷 P2196 [NOIP1996 提高组] 挖地雷
作者:互联网
思路:dfs.
#include<iostream>
using namespace std;
int a[25],f[25];
int w[25][25];//记录两地窖间是否连通
int b[25],p[25];//p和f数组用来记录路径
int cnt,maxn;
int n;
bool check(int x)
{
for(int i=1;i<=n;i++)
{
if(w[x][i]&&!b[i])return false;
}
return true;
}
void dfs(int x,int step,int y)
{
if(check(x))//判断是否还能继续往下走,如果可以,记录一下最大值以及目前已经走了的路径,不可以则返回
{
if(maxn<y)
{
maxn=y;
cnt=step;
for(int i=1;i<=step;i++)
{
f[i]=p[i];
}
}
return;
}
for(int i=1;i<=n;i++)
{
if(w[x][i]&&!b[i])
{
b[i]=1;
p[step+1]=i;
dfs(i,step+1,a[i]+y);
b[i]=0;//回溯
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
cin>>w[i][j];
}
}
for(int i=1;i<=n;i++)
{
b[i]=1;
p[1]=i;
dfs(i,1,a[i]);
b[i]=0;
}
for(int i=1;i<=cnt;i++)
{
cout<<f[i]<<" ";
}
cout<<endl<<maxn<<endl;
return 0;
}
标签:25,挖地雷,洛谷,记录,int,NOIP1996,check 来源: https://blog.csdn.net/Y12309/article/details/120296420