P8817 95pts蒟蒻求调(感谢)
查看原帖
P8817 95pts蒟蒻求调(感谢)
209691
Red_Alert_star楼主2023/8/9 23:58

95Pts

不知为什么WA,也不让下载数据

代码如下(有些冗长):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
struct node{
	int next;
	int to;
	int v;
}edge[20010];
struct aa{
	long long val;
	int id;
}a[2501];
int n,m,k,d[2501][2501],head[2501],cnt=0;
long long f[2501][4];
queue<int> q;
void add(int x,int y,int z)
{
	edge[++cnt].next=head[x];
	head[x]=cnt;
	edge[cnt].to=y;
	edge[cnt].v=1;
}
void bfs(int s)
{
	for(int j=1;j<=n;j++)
	{
		d[s][j]=2147483646;
	}
	int vis[2501];
	d[s][s]=0;
	q.push(s);
	while(!q.empty())
	{
		int t=q.front();
		q.pop();
		if(d[s][t]+1>k+1) continue;
		for(int i=head[t];i;i=edge[i].next)
		{
			if(d[s][edge[i].to]>d[s][t]+1)
			{
				d[s][edge[i].to]=d[s][t]+1;
				q.push(edge[i].to);
			}
		}
	}
}
int main()
{
	cin>>n>>m>>k;
	for(int i=2;i<=n;i++)
	{
		cin>>a[i].val;
		a[i].id=i;
	 } 
	for(int i=1,x,y;i<=m;i++)
	{
		cin>>x>>y;
		add(x,y,1);
		add(y,x,1);
	}
	for(int i=1;i<=n;i++) bfs(i);
	aa max1,max2,max3,t1,t2;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=3;j++) f[i][j]=i;
	}
	for(int i=2;i<=n;i++)
	{
		max1.val=0,max2.val=0,max3.val=0,max1.id=0,max2.id=0,max3.id=0;
		for(int j=2;j<=n;j++)
		{
			if(d[i][j]!=2147483646&&j!=i&&d[1][j]!=2147483646)
			{
//				cout<<a[j].val<<" ";
				if(max1.val==0)
				{
					max1=a[j];
					continue;
				 } 
				else if(max2.val==0)
				{
					max2=a[j];
					continue;
				 } 
				else if(max3.val==0)
				{
					max3=a[j];
					continue;
				 } 
				if(a[j].val>max1.val)
				{
					t1=max1;
					t2=max2;
					max1=a[j];
					max2=t1;
					max3=t2;
					
				}
				else
				{
					if(a[j].val>max2.val)
					{
						t1=max2;
						max2=a[j];
						max3=t1;
					}
					else
					{
						if(a[j].val>max3.val) max3=a[j];
					}
				}
			}
		}
		t1=max1,t2=max2;
		if(max3.val>max2.val)
		{
			max2=max3;
			max3=t2;
		}
		if(max2.val>max1.val)
		{
			max1=max2;
			max2=t1;
		}
		t2=max2;
		if(max3.val>max2.val)
		{
			max2=max3;
			max3=t2;
		}
		f[i][1]=max1.id,f[i][2]=max2.id;f[i][3]=max3.id;
	}
	long long ans=0;
	for(int b=2;b<=n;b++)
	{
		for(int c=2;c<=n;c++)
		{
			if(d[b][c]==2147483646) continue;
			if(b==c) continue;
			for(int tota=1;tota<=3;tota++)
			{
				if(f[b][tota]==0) break;
				for(int totd=1;totd<=3;totd++)
				{
					if(f[c][totd]==0) break;
					if(f[b][tota]!=c&&f[c][totd]!=b&&f[b][tota]!=f[c][totd])
					{
						ans=max(ans,a[b].val+a[c].val+a[f[b][tota]].val+a[f[c][totd]].val);
						break;
					 } 
				}
			}
		}
		
	}
	cout<<ans;
	return 0;
}
2023/8/9 23:58
加载中...