30pts,样例过但有红有黑,求助
查看原帖
30pts,样例过但有红有黑,求助
169594
Heart_Of_Iron_4楼主2023/8/11 11:58

rt

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define FOR(qw,we,er) for(int qw=we;qw<=er;++qw)
int n,m,k,a[2600],b[2600][2600],c[2600][2600],d[2600][4],ans,
t1,t2,t3,t4,t5;
int te;
queue<int> q;
bool unequal(int q,int w,int e,int r)
{
	if(q!=w&&q!=e&&q!=r&&w!=e&&w!=r&&e!=r)return 1;
	else return 0;
}
signed main()
{
	memset(c,0x8000,sizeof(c));
	scanf("%lld%lld%lld",&n,&m,&k);
	FOR(i,2,n)scanf("%lld",&a[i]);
	FOR(i,1,m)
	{
		scanf("%lld%lld",&t1,&t2);
		b[t1][t2]=b[t2][t1]=1;
	}
	FOR(i,1,n)
	{
		while(!q.empty())q.pop();
		q.push(i);
		while(!q.empty())
		{
			te=q.front();
			FOR(j,1,n)
			{
				if(b[te][j]&&!c[i][j]&&j!=i)
				{
					c[i][j]=c[i][te]+1;
					q.push(j);
				}
			}
			q.pop();
		}
	}
	/*FOR(i,1,n)
	{
		FOR(j,1,n)printf("%lld ",c[i][j]);
		puts("");
	}*/
	FOR(i,1,n)
	{
		t1=0;
		FOR(j,2,n)
		{
			if(j==i)continue;
			if(c[1][j]<=k+1&&c[j][i]<=k+1&&t1<a[i])
			{
				t1=a[i];
				d[i][1]=j;
			}
		}
		t1=0;
		FOR(j,2,n)
		{
			if(j==i)continue;
			if(c[1][j]<=k+1&&c[j][i]<=k+1&&t1<a[i]&&j!=d[i][1])
			{
				t1=a[i];
				d[i][2]=j;
			}
		}
		t1=0;
		FOR(j,2,n)
		{
			if(j==i)continue;
			if(c[1][j]<=k+1&&c[j][i]<=k+1&&t1<a[i]&&j!=d[i][1]
				&&j!=d[i][2])
			{
				t1=a[i];
				d[i][3]=j;
			}
		}
	}
	FOR(i,2,n)FOR(j,2,n)
	{
		if(i==j)continue;
		FOR(z,1,3)FOR(x,1,3)
		{
			if(c[i][j]<=k+1&&unequal(i,j,d[i][z],d[j][x])&&d[i][z]&&d[j][x])
			{
				ans=max(ans,a[i]+a[j]+a[d[i][z]]+a[d[j][x]]);
				//printf("%lld %lld %lld %lld %lld\n",d[i][z],i,j,d[j][x],a[i]+a[j]+a[d[i][z]]+a[d[j][x]]);
			}
			
		}
	}
//	FOR(i,1,n)printf("%lld %lld %lld\n",d[i][1],d[i][2],d[i][3]);
	printf("%lld",ans);
	return 0;
}

目前认为TLE是bfs的锅,但请问如何优化?

2023/8/11 11:58
加载中...