注释求助!!
查看原帖
注释求助!!
464943
LHHDHRSD_Heiko楼主2022/7/9 17:50
#include<bits/stdc++.h>
using namespace std;
int x,n,f,ans2,ans[50],a[50],steps[50];		//ans2:最多个数 
bool g[50][50],vis[50];		//g[x][y]:x与y联通   vis[z]:是否走过 

//DFS递归版 
void dfs(int x,int s,int t)		//x为起始点,y为终点,t为次数 
{
    int flag=1;
    for(int i=x+1;i<=n;i++)
	{
		if(g[x][i] && !vis[i])
		{
			flag=0;		//标记 
		}
	}
    if(flag && ans2<s)
	{
        ans2=s;			//更新最大值 
        f=t;
        for(int i=1;i<=t;i++)
		{
			ans[i]=steps[i];			//顺序代表所走到的地方且符合要求的地方 
		}
    }
    if(flag)		//标记过 
	{
		return;
	}
    for(int i=x+1;i<=n;i++)
	{
        if(g[x][i] && !vis[i])        //联通且未访问 
		{
			steps[t+1]=i;			//更新步数 
			vis[i]=1;				//标记 
			dfs(i,s+a[i],t+1);		//往下搜 
			steps[t+1]=0;			//归0 
			vis[i]=0;				//改为未标记 
		}
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
	{
		cin>>a[i]; 
	}
    for(int i=1;i<=n-1;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			cin>>x;
			g[i][j]=x;			//标记联通 
		} 	
	}
    for(int i=1;i<=n;i++)
	{
		steps[1]=i;			//初始化第一步 
		vis[i]=1;
		dfs(i,a[i],1);		//往下搜 
		vis[i]=0;			//归0 
	}
    for(int i=1;i<=f;i++)
	{
		cout<<ans[i]<<" ";	//输出 
	}
    cout<<endl<<ans2<<endl;
    return 0;
}
2022/7/9 17:50
加载中...