70pts,用的找前三大的算法,求大佬帮忙看一下
查看原帖
70pts,用的找前三大的算法,求大佬帮忙看一下
421265
eastcloud楼主2022/11/2 20:41
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#define ll long long
using namespace std;
ll pts[1000001];
vector<ll> ori[1000001];
ll dis[2501],vis[2501];
ll ma[2501][2501];
struct Node{
	ll val,x;
};
priority_queue<Node> t;
bool operator <(Node x,Node y){
	return x.val>y.val;
}
ll n,m,k;
void dij(ll x){
	memset(dis,0x7f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[x]=1;
	t.push((Node){1,x});
	while(!t.empty()){
		ll u=t.top().x;
		t.pop();
		if(vis[u]) continue;
		vis[u]++;
		for(ll i=0;i<ori[u].size();i++){
			ll v=ori[u][i];
			if(dis[v]>dis[u]+1){
				dis[v]=dis[u]+1;
				t.push((Node){dis[v],v});
			}
		}
	}
	for(ll i=1;i<=n;i++){
		if(dis[i]<=k+2){
			ma[i][x]=1;
			ma[x][i]=1;
		}
	}
}
ll fm[100001][6];
ll fr[100001][6];
int main(){
	ll u,v,m;
	cin>>n>>m>>k;
	for(ll i=2;i<=n;i++) cin>>pts[i];
	for(ll i=1;i<=m;i++){
		cin>>u>>v;
		ori[u].push_back(v);
		ori[v].push_back(u);
	}
	for(ll i=1;i<=n;i++) dij(i);
	for(ll i=2;i<=n;i++){
		for(ll j=2;j<=n;j++){
			if(i!=j && ma[i][j] && ma[1][j]){
				if(pts[j]>fm[i][1]){
					fm[i][3]=fm[i][2];
					fr[i][3]=fr[i][2];
					fm[i][2]=fm[i][1];
					fr[i][2]=fr[i][1];
					fm[i][1]=pts[j]+pts[i];
					fr[i][1]=j;
				}
				else if(pts[j]>fm[i][2]){
					fm[i][3]=fm[i][2];
					fr[i][3]=fr[i][2];
					fm[i][2]=pts[j]+pts[i];
					fr[i][2]=j;
				}
				else if(pts[j]>fm[i][3]){
					fm[i][3]=pts[j]+pts[i];
					fr[i][3]=j;
				}
			}
		}
	}
	ll ans=0;
	for(ll i=2;i<=n;i++){
		for(ll j=2;j<=n;j++){
			if(i==j || !ma[i][j]) continue;
			for(int p=1;p<=3;p++){
				for(int q=1;q<=3;q++){
					if(!fr[i][p] || !fr[j][q]) continue;
					if(fr[i][p]==j || fr[i][p]==fr[j][q] || i==fr[j][q]) continue;
					ans=max(ans,fm[i][p]+fm[j][q]);
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
2022/11/2 20:41
加载中...