95pts求助!!!#45TLE
查看原帖
95pts求助!!!#45TLE
678191
Eric_jx楼主2023/2/25 09:21
#include<bits/stdc++.h>
using namespace std;
int w[1000001];
int h[1000001];
int v[1000001];
int ne[1000001];
int dis[1000001];
int cnt=0,s,k;
int c[1000001];
int vis[1000001];
int n,m;
typedef pair<int, int> PI;
void dijstla() {
	for(int i=1; i<=n; i++) {
		vis[i]=0;
		dis[i]=INT_MAX;
	}
	priority_queue<pair<int,int>, vector<pair<int,int> >,greater<pair<int,int> > > q;
	dis[s]=0;
	q.push({0,s});
	while(!q.empty()) {
		PI t=q.top();
		q.pop();
		int x=t.first;
		int y=t.second;
		if(vis[y]) {
			continue;
		}
		vis[y]=1;
		for(int 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]});
			}
		}
	}
}
int dis2[2500][2500];
int b[1000001];
void add(int x,int y) {
	v[++cnt]=y;
	ne[cnt]=h[x];
	h[x]=cnt;
}
struct stu {
	int x,y;
} a[100001];
bool cmp(stu x,stu y) {
	return x.x<y.x;
}
int main() {
	memset(h,-1,sizeof(h));
	cin>>n>>m>>k;
	for(int i=2; i<=n; i++) {
		cin>>w[i];
		a[i].x=w[i];
		a[i].y=i;
	}
	int ans=0;
	sort(a+2,a+2+n,cmp);
	while(m--) {
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	for(int i=1; i<=n; i++) {
		s=i;
		dijstla();
		for(int j=1; j<=n; j++) {
			dis2[i][j]=dis[j];
		}
	}
	for(int i=2; i<=n; i++) {
		if(dis2[1][i]==INT_MAX) {
			continue;
		}
		int sum1=0,sum2=0;
		for(int j=n; j>=2; j--) {
			if(a[j].y!=1&&a[j].y!=i) {
				sum1+=a[j].x;
				sum2++;
			}
			if(sum2==3) {
				break;
			}
		}
		if(w[i]+sum1<=ans) {
			continue;
		}
		for(int j=2; j<=n; j++) {
			if(j!=i) {
				if(dis2[i][j]==INT_MAX) {
					continue;
				}
				sum1=0,sum2=0;
				for(int k=n; k>=2; k--) {
					if(a[k].y!=1&&a[k].y!=i&&a[k].y!=j) {
						sum1+=a[k].x;
						sum2++;
					}
					if(sum2==2) {
						break;
					}
				}
				if(w[i]+sum1+w[j]<=ans) {
					continue;
				}
				for(int k=2; k<=n; k++) {
					if(k!=i&&k!=j) {
						if(dis2[j][k]==INT_MAX) {
							continue;
						}
						sum1=0,sum2=0;
						for(int o=n; o>=2; o--) {
							if(a[o].y!=1&&a[o].y!=i&&a[o].y!=j&&a[o].y!=k) {
								sum1+=a[o].x;
								sum2++;
							}
							if(sum2==1) {
								break;
							}
						}
						if(w[i]+w[j]+w[k]+sum1<=ans) {
							continue;
						}
						for(int o=2; o<=n; o++) {
							if(o!=i&&o!=j&&o!=k) {
								if(dis2[k][o]==INT_MAX) {
									continue;
								}
								if(dis2[o][1]==INT_MAX) {
									continue;
								}
								ans=max(ans,w[i]+w[j]+w[k]+w[o]);
							}

						}
					}
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
2023/2/25 09:21
加载中...