最后一个测试点运行超时😭

img

#include
#include
using namespace std;
int c,n,s,m,path[101][101]={0},bike_sum[101],book[101]={0},mm=99999999,per,need_bike=0,need_bike_mm=0,back_bike=0,back_bike_mm=0;
void dfs(int x,int y);
struct route{
int ro[101],cnt=0;
}p1,MM;
int main()
{
cin>>c>>n>>s>>m;
int i;per=c/2;
for(i=1;i<=n;i++)
{
cin>>bike_sum[i];
}
for(i=0;i<m;i++)
{
int s1,s2;
cin>>s1>>s2>>path[s1][s2];
path[s2][s1]=path[s1][s2];
}
dfs(0,0);
cout<<need_bike_mm;
cout<<" 0->";
for(i=0;i<MM.cnt;i++)
{
cout<<MM.ro[i];
if(i<MM.cnt-1)cout<<"->";
}
cout<<' '<<back_bike_mm;
return 0;
}
void dfs(int x,int y)
{
if(y>mm)return;
if(x==s)
{
if(y<mm)
{
mm=y;
MM=p1;
need_bike_mm=need_bike;
back_bike_mm=back_bike;
}
else if(y==mm)
{
if(need_bike<need_bike_mm||(need_bike_mm==need_bike&&back_bike<back_bike_mm))
{
mm=y;
MM=p1;
need_bike_mm=need_bike;
back_bike_mm=back_bike;
}
}
return;
}
for(int i=1;i<=n;i++)
{
if(book[i]==0&&path[x][i]!=0)
{
book[i]=1;p1.ro[p1.cnt++]=i;y+=path[x][i];
int z1=need_bike,z2=back_bike,z=per-bike_sum[i];
if(z>0)
{
if(back_bike>0)
{
if(back_bike>=z)back_bike-=z;
else
{
need_bike+=(z-back_bike);back_bike=0;
}
}
else
{
need_bike+=z;
}
}
if(z<0)
{
back_bike+=abs(z);
}
dfs(i,y);
book[i]=0;p1.cnt--;y-=path[x][i];
need_bike=z1;
back_bike=z2;
}
}
return;