wa 只有45分 求助
查看原帖
wa 只有45分 求助
315398
小杨小小杨楼主2023/10/18 20:31
#include<bits/stdc++.h>
using namespace std;
int n,m,k,i,j,l,x,y,e[2510][2510],tot,head[2510],tots[2510],a[2510],ma,inf;
struct Node{int sum,id;}p[2510][2510];
struct Edge{int to,nex;}edge[40010];
void ins(int x,int y){edge[tot].to=y;edge[tot].nex=head[x];head[x]=tot++;}
Node make(int x,int y){Node node;node.sum=x;node.id=y;return node;}
void sc(int x){
	int i;
	queue<int> p;
	p.push(x);
	while (!p.empty()){
		int fs=p.front();p.pop();
		for (int i=head[fs];~i;i=edge[i].nex){
			int v=edge[i].to;
			if (e[x][v]>e[x][fs]+1) e[x][v]=e[v][x]=e[x][fs]+1,p.push(v);
		} 
	}
}
bool cmp(Node x,Node y){return x.sum>y.sum;}
int main(){
	scanf("%d%d%d",&n,&m,&k);k++;
	for (i=2;i<=n;i++) scanf("%d",&a[i]);
	memset(head,-1,sizeof(head));memset(e,0x3f3f3f3f,sizeof(e));
	for (i=1;i<=m;i++) scanf("%d%d",&x,&y),ins(x,y),ins(y,x);
	for (i=1;i<=n;i++) e[i][i]=0,sc(i);
	for (i=2;i<=n;i++)
		for (j=2;j<=n;j++)
			if (i!=j)
				if (e[1][j]<=k&&e[j][i]<=k)
					if (tots[i]<3) p[i][++tots[i]]=make(a[j]+a[i],j);
					else if (p[i][1].sum<p[i][2].sum&&p[i][1].sum<p[i][3].sum&&p[i][1].sum<a[j]+a[i]) p[i][1]=make(a[j]+a[i],j);
					else if (p[i][2].sum<p[i][1].sum&&p[i][2].sum<p[i][3].sum&&p[i][2].sum<a[j]+a[i]) p[i][2]=make(a[j]+a[i],j);
					else if (p[i][3].sum<p[i][1].sum&&p[i][3].sum<p[i][2].sum&&p[i][3].sum<a[j]+a[i]) p[i][3]=make(a[j]+a[i],j);
	for (i=2;i<=n;i++)
		for (j=2;j<=n;j++)
			if (i!=j&&tots[i]!=0&&tots[j]!=0&&e[i][j]<=k)
				for (k=1;k<=tots[i];k++)
					for (l=1;l<=tots[j];l++)
						if (p[j][l].id!=i&&p[j][l].id!=p[i][k].id&&p[i][k].id!=j)
							ma=max(ma,p[j][l].sum+p[i][k].sum);
	printf("%d\n",ma);
	return 0;
}
2023/10/18 20:31
加载中...