萌新求助,P8817 [CSP-S 2022] 假期计划的代码求调
  • 板块学术版
  • 楼主qyzyq
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/2/15 20:40
  • 上次更新2023/10/24 00:41:43
查看原帖
萌新求助,P8817 [CSP-S 2022] 假期计划的代码求调
50506
qyzyq楼主2023/2/15 20:40

代码如下:求助

#include<bits/stdc++.h>
#define ll long long
#define PLL pair<ll,ll>
using namespace std;
const ll N=3010,M=20010;
ll n,m,k,a[N];
ll h[N],e[M*2],ne[M*2],idx;
ll dist[N][N];
bool vis[N];
void add(ll x,ll y)
{
	e[idx]=y;
	ne[idx]=h[x];
	h[x]=idx++;
}
ll lu,dq;
ll ans;
void dijkstra(ll wz)
{
	memset(vis,false,sizeof vis);
	dist[wz][wz]=0;
	priority_queue<PLL,vector<PLL>,greater<PLL> > p;
	p.push({0,wz});
	while(!p.empty())
	{
		lu=p.top().first;
		dq=p.top().second;
		p.pop();
		if(vis[dq]) continue;
		vis[dq]=true;
//		dist[wz][dq]=lu;
		for(ll i=h[dq];i!=-1;i=ne[i])
		{
			ll j=e[i];
			if(lu+1<dist[wz][j])
			{
				dist[wz][j]=lu+1;
				p.push({dist[wz][j],j});
			}
		}
	}
}
ll shu[2510][10];
ll t1,t2,t3,t4,t5,t6;
int main()
{
	memset(h,-1,sizeof h);
	ll x,y;
	scanf("%lld %lld %lld",&n,&m,&k);
	k++;
	for(ll i=2;i<=n;i++)
	scanf("%lld",&a[i]);
	for(ll i=1;i<=m;i++)
	{
		scanf("%lld %lld",&x,&y);
		add(x,y);
		add(y,x);
	}
	memset(dist,0x3f3f3f3f3f3f,sizeof dist); 
	for(ll i=1;i<=n;i++)
	dijkstra(i);
	for(ll i=2;i<=n;i++)
	{
		for(ll j=2;j<=n;j++)
		{
			if(i==j) continue;
			if(dist[1][i]<=k&&dist[i][j]<=k)
			{
				t1=shu[j][1];
				t2=shu[j][2];
				t3=shu[j][3];
				t4=shu[j][4];
				t5=shu[j][5];
				t6=shu[j][6];
				if(a[i]>a[t6]) t6=i;
				if(a[t6]>a[t5]) swap(t6,t5);
				if(a[t5]>a[t4]) swap(t5,t4);
				if(a[t4]>a[t3]) swap(t4,t3);
				if(a[t3]>a[t2]) swap(t3,t2);
				if(a[t2]>a[t1]) swap(t2,t1);
				shu[j][1]=t1;
				shu[j][2]=t2;
				shu[j][3]=t3;
				shu[j][4]=t4;
				shu[j][5]=t5;
				shu[j][6]=t6;
			}
		}
	}
	for(ll i=2;i<=n;i++)
	{
		for(ll j=2;j<=n;j++)
		{
			for(ll k=1;k<=4;k++)
			{
				for(ll f=1;f<=4;f++)
				{
					if(!shu[i][k]||!shu[j][f]) continue;
					if(dist[i][j]>k) continue;
					if(i!=j&&j!=shu[i][k]&&shu[i][k]!=shu[j][f]&&i!=shu[i][k]&&i!=shu[j][f]&&j!=shu[j][f])
					{
						ans=max(ans,a[i]+a[j]+a[shu[i][k]]+a[shu[j][f]]);
//						cout<<shu[i][k]<<" "<<i<<" "<<" "<<j<<" "<<shu[j][f]<<" "<<ans<<"\n";
					}
				}
			}
		}
	}
	cout<<ans;
	return 0;
}
2023/2/15 20:40
加载中...