100pts,但民间数据WA了一个点求助!
查看原帖
100pts,但民间数据WA了一个点求助!
678191
Eric_jx楼主2023/8/16 16:36
#include<bits/stdc++.h>
using namespace std;
long long w[1000001];
long long h[1000001];
long long v[1000001];
long long ne[1000001];
long long dis[1000001];
long long cnt=0,s,k;
long long c[1000001];
long long vis[1000001];
long long n,m;
typedef pair<long long, long long> PI;
void dijstla() {
	for(long long i=1;i<=n;i++){
		vis[i]=0;
		dis[i]=INT_MAX;
	}
	priority_queue<pair<long long,long long>, vector<pair<long long,long long> >,greater<pair<long long,long long> > > q;
	dis[s]=0;
	q.push({0,s});
	while(!q.empty()) {
		PI t=q.top();
		q.pop();
		long long x=t.first;
		long long y=t.second;
		if(vis[y]) {
			continue;
		}
		vis[y]=1;
		for(long long i=h[y]; i!=-1; i=ne[i]) {
			if(y==s){
				if(dis[y]<=k&&dis[y]<dis[v[i]]) {
					dis[v[i]]=dis[y];
					q.push({dis[v[i]],v[i]});
				}
				continue;
			}
			if(dis[y]+1<=k&&dis[y]+1<dis[v[i]]) {
				dis[v[i]]=dis[y]+1;
				q.push({dis[v[i]],v[i]});
			}
		}
	}
}
long long op[2500][2500];
void add(long long x,long long y){
	v[++cnt]=y;
	ne[cnt]=h[x];
	h[x]=cnt;
}
long long f1[1000005],f2[1000005],f3[1000005],last[1000005],last2[1000005];
int main(){
	memset(h,-1,sizeof(h));
	cin>>n>>m>>k;
	for(long long i=2;i<=n;i++){
		cin>>w[i];
	}
	long long ans=0;
	while(m--){
		long long x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	for(long long i=1;i<=n;i++){
		s=i;
		dijstla();
		for(long long j=1;j<=n;j++){
			op[i][j]=dis[j];
		}
	}
	for(long long i=2;i<=n;i++){
		if(op[1][i]==INT_MAX){
			continue;
		}
		for(long long j=2;j<=n;j++){
			if(op[i][j]==INT_MAX||j==i){
				continue;
			}
			if(w[i]+w[j]>f1[j]){
				f1[j]=w[i]+w[j];
				last[j]=i;
			} 
		}
	}
	
	for(long long i=2;i<=n;i++){
		for(long long j=2;j<=n;j++){
			if(op[i][j]==INT_MAX||j==i||j==last[i]){
				continue;
			}
			if(f1[i]+w[j]>f2[j]){
				f2[j]=f1[i]+w[j];
				last2[j]=i;
			} 
		}
	}
	for(long long i=2;i<=n;i++){
		for(long long j=2;j<=n;j++){
			if(op[i][j]==INT_MAX||j==i||j==last2[i]||j==last[last2[i]]||op[j][1]==INT_MAX){
				continue;
			}
			if(f2[i]+w[j]>f3[j]){
				f3[j]=f2[i]+w[j];
				ans=max(ans,f3[j]);
			} 
		}
	}cout<<ans;
	return 0;
}
2023/8/16 16:36
加载中...