求助!!!85分有红有黑
查看原帖
求助!!!85分有红有黑
551803
BPG_ning楼主2023/6/5 00:13
#include<bits/stdc++.h> 
using namespace std;
typedef unsigned long long LL;
typedef pair<LL,int> pii;
const int N=5000,M=10010;
const LL inf=1e18+10;
int n,m,k,num,vis[N];
int cnt,to[M<<1],nxt[M<<1],head[N];
LL a[N],f[N][10],dis[N][N];
pii p[N];
void add(int x,int y){
	to[++cnt]=y;
	nxt[cnt]=head[x];
	head[x]=cnt;
}
LL MAX(LL a,LL b){return (a>b?a:b);}
int MIN(int a,int b){return (a>b?b:a);}
bool cmp(pii x,pii y){return x.first>y.first;}
void bfs(int xx){
	num=0;
//	memset(p,0,sizeof(p));
	memset(vis,0,sizeof(vis));
	queue<pii> q;q.push(make_pair(xx,-1));
	while(!q.empty()){
		pii h=q.front();
		q.pop();
		int x=h.first;
		dis[xx][x]=h.second;
		if(x!=1&&x!=xx&&h.second<=k&&dis[1][x]<=k){
			p[++num]=make_pair(a[x],x);
			sort(p+1,p+1+num,cmp);
			if(num>3) num--;
//			cout<<"bfs::"<<x<<' '<<xx<<endl;
		}
		if(h.second==k) continue;
		vis[x]=1;
		for(int i=head[x];i!=0;i=nxt[i]){
			int y=to[i];
//			cout<<x<<' '<<y<<endl;
			if(vis[y])continue;
			q.push(make_pair(y,h.second+1));
		}
	}
	for(int j=1;j<=min(3,num);j++) f[xx][j]=p[j].second;//,cout<<xx<<' '<<p[j].second<<endl;
//	cout<<f[3][5]<<endl;
}

signed main(){
	ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0); 
  	freopen("nzq.in","r",stdin);
  	freopen("nzq.out","w",stdout);
	cin>>n>>m>>k;
 	for(int i=1;i<=n;i++){
	 for(int j=1;j<=n;j++) dis[i][j]=inf;}
	for(int i=2;i<=n;i++)cin>>a[i];
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	bfs(1);
	memset(f,0,sizeof(f));
	for(int i=2;i<=n;i++){
		bfs(i);
	}
	LL Max=0;
	a[0]=-inf;
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
//			cout<<i<<' '<<j<<' '<<dis[1][i]<<' '<<dis[1][j]<<' '<<endl;
			if(i!=j&&dis[i][j]<=k)
			for(int s=1;s<=3;s++){
				for(int t=1;t<=3;t++){
					int x=f[i][s],y=f[j][t];
					if(x!=y&&x!=j&&y!=i&&x!=0&&y!=0)
					Max=MAX(Max,a[i]+a[j]+a[x]+a[y]);
//					cout<<dis[i][x]<<' '<<i<<' '<<j<<' '<<x<<' '<<y<<' '<<a[i]+a[j]+a[x]+a[y]<<endl;
				}	
			}
		}
	}
	cout<<Max<<endl;
//	cout<<dis[5][6]<<' '<<k<<endl;
//	cout<<f[3][5]<<endl;
    return 0;
}

思路与第一篇题解类似

2023/6/5 00:13
加载中...