100但是WA求调
查看原帖
100但是WA求调
169326
panxz2009楼主2024/5/2 08:58

代码如下:

#include<bits/stdc++.h>
#define pii pair<int,int>
#define int long long
using namespace std;
int read()
{
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return x*f;
}
const int maxn=2510;
int n,m,k,val[maxn],ans;
int num[maxn][maxn],cnt[maxn],cnt1,cnt2,cnt3,cnt4;
vector<int>G[maxn];
queue<pii>q;
bool mp[maxn][maxn];
void bfs(int s)
{
	q.push({s,0});
	while(!q.empty())
	{
		int u=q.front().first,kk=q.front().second;
		q.pop();
		if(kk==k+1) continue;
		for(int v:G[u])
		{
			if(mp[s][v]) continue;
			mp[s][v]=1;
			q.push({v,kk+1});
		}
	}
}
signed main()
{
//	freopen("holiday3.in","r",stdin);
	n=read(),m=read(),k=read();
	for(int i=2;i<=n;i++) val[i]=read();
	for(int i=1,u,v;i<=m;i++)
	{
		u=read(),v=read();
		G[u].push_back(v);
		G[v].push_back(u);
	}
	for(int i=1;i<=n;i++) bfs(i);
	for(int i=2;i<=n;i++)     //枚举景点1 
		for(int j=2;j<=n;j++) //枚举景点2 
		{
			if(i==j) continue;
			if(mp[1][i] && mp[i][j]) num[j][++cnt[j]]=i;
		}
	for(int i=1;i<=n;i++) sort(num[i]+1,num[i]+1+cnt[i],[](int x,int y) {return val[x]>val[y];});
	for(int i=2;i<=n;i++)
		for(int j=2;j<=n;j++)
		{
			if(i==j || !mp[i][j] || !cnt[i] || !cnt[j]) continue;
			cnt1=cnt2=1;
			if(num[i][1]==j)
			{
				if(cnt[i]==1) continue;
				cnt1++;
			}
			if(num[j][1]==i)
			{
				if(cnt[j]==1) continue;
				cnt2++;
			}
			if(num[i][cnt1]!=num[j][cnt2])
			{
				ans=max(ans,val[i]+val[j]+val[num[i][cnt1]]+val[num[j][cnt2]]);
				continue;
			}
			cnt3=cnt1+1,cnt4=cnt2+1;
			bool flag1=0,flag2=0;
			if(num[i][cnt3]==j)
			{
				cnt3++;
				if(cnt3>cnt[i]) flag1=1;
			}
			if(num[j][cnt4]==i)
			{
				cnt4++;
				if(cnt4>cnt[j]) flag2=1;
			}
			if(!flag1) ans=max(ans,val[i]+val[j]+val[num[i][cnt3]]+val[num[j][cnt2]]);
			if(!flag2) ans=max(ans,val[i]+val[j]+val[num[i][cnt1]]+val[num[j][cnt4]]);
		}
	printf("%lld\n",ans);
	return 0;
}
2024/5/2 08:58
加载中...