MnZn40pts求助
查看原帖
MnZn40pts求助
917260
visit楼主2024/10/16 06:33

小样例过了,大样例炸了好像,但是不知为何

思路 BFS

求调

#include<bits/stdc++.h>
using namespace std;
struct node{
	int step,x,cnt;
	//step步数<=k  x实时位置  过了cnt个景点<=4 
	int chs[5];//选的景点 
}q[30000000];
int n,m,k;
long long sc[3000],ans;
int vi[2700][30100],minn[2700];

//算minn
int xxx[2700];

int main()
{
//	freopen("holiday3.in","r",stdin);
//	freopen("holidayday.txt","w",stdout);
	cin>>n>>m>>k;
	memset(minn,-1,sizeof(minn));
	for(int i=2;i<=n;i++) scanf("%d",&sc[i]);
	sc[1]=0;
	for(int i=1;i<=m;i++)
	{
		int xx,yy;
		scanf("%d%d",&xx,&yy);
		if(xx==1) minn[yy]=0,xxx[++xxx[0]]=yy;
		if(yy==1) minn[xx]=0,xxx[++xxx[0]]=xx;
		vi[xx][++vi[xx][0]]=yy;
		vi[yy][++vi[yy][0]]=xx;
	}
//	for(int i=1;i<=n;i++)
//	{
//		cout<<i<<endl;
//		for(int j=1;j<=vi[i][0];j++)
//		{
//			cout<<vi[i][j]<<" ";
//		}
//		cout<<endl;
//	}
//	cout<<endl;
	for(int i=1;i<=xxx[0];i++)//计算每个景点到家的最短路
	{
		int xx=xxx[i];
		for(int j=1;j<=vi[xx][0];j++)
		{
			int kk=vi[xx][j];
			int dd=minn[xx]+1;
			if(minn[kk]==-1||minn[kk]>dd) minn[kk]=dd,xxx[++xxx[0]]=kk;
		}
	} 	
	minn[1]=0;
//	for(int i=1;i<=n;i++) cout<<minn[i]<<endl;	
//	cout<<endl;
	q[1].step=-1,q[1].x=1;
	int h=1,t=1;
	while(h<=t)
	{
		node e=q[h],v;
		for(int i=1;i<=vi[e.x][vi[e.x][0]];i++)
		{
			v=e;
			v.step++;
			if(v.step>k) break;
			if(v.cnt>=4) break;
			v.x=vi[e.x][i];
			q[++t]=v;
			if(vi[e.x][i]==1||vi[e.x][i]==v.chs[1]||vi[e.x][i]==v.chs[2]||vi[e.x][i]==v.chs[3]||vi[e.x][i]==v.chs[4]) continue;
			v.cnt++;
			v.chs[v.cnt]=vi[e.x][i];
			v.step=-1;
			if(v.cnt==4&&(minn[v.chs[v.cnt]]==-1||minn[v.chs[v.cnt]]>k)) continue;
			if(v.cnt==4)
			{
				long long sum=sc[v.chs[1]]+sc[v.chs[2]]+sc[v.chs[3]]+sc[v.chs[4]];
				if(ans<sum) 
				{
					ans=sum;
//					cout<<v.chs[1]<<" "<<v.chs[2]<<" "<<v.chs[3]<<" "<<v.chs[4]<<endl;
//					cout<<sc[v.chs[1]]<<" "<<sc[v.chs[2]]<<" "<<sc[v.chs[3]]<<" "<<sc[v.chs[4]]<<endl;
				}
			} 
			q[++t]=v;
		}
		h++;
	}
	cout<<ans;
	return 0;
}
2024/10/16 06:33
加载中...