50分求助,用的三大做法
查看原帖
50分求助,用的三大做法
304504
蓝__楼主2022/11/5 15:28

50,错的地方毫无规律...

#include<bits/stdc++.h>
using namespace std;
int n,m,num,k,f[10001],c[10001],head[10001],li[10001],lii[10001],liii[10001],ti[10001];
long long vl[10001],ans;
bool pan[2601][2601];
struct edge{int to,next,val;}a[100001];
struct node{int dis,id;};
inline void ad(int u,int v,int w){a[++num].to=v; a[num].next=head[u]; a[num].val=w; head[u]=num;}
priority_queue<node>q;
inline bool operator <(node X,node Y){return Y.dis<X.dis;}
inline void dijkstra(int st){
	while(!q.empty()) q.pop();
	memset(f,0x3f,sizeof(f)); q.push((node){0,st});
	memset(c,0,sizeof(c)); f[st]=0;
	while(!q.empty()){
		node now=q.top(); q.pop();
		if(c[now.id]==1) continue; c[now.id]=1;
		for(register int i=head[now.id];i!=0;i=a[i].next){
			if(f[now.id]+a[i].val<f[a[i].to]){
				f[a[i].to]=f[now.id]+a[i].val;
				q.push((node){f[a[i].to],a[i].to});
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin>>n>>m>>k; ++k;
	for(register int i=2;i<=n;++i) cin>>vl[i];
	for(register int i=1;i<=m;++i){
		int x,y; cin>>x>>y;
		ad(x,y,1); ad(y,x,1);
	}
	dijkstra(1);
	for(register int i=2;i<=n;++i) if(f[i]<=k) ti[i]=1;
	for(register int i=2;i<=n;++i){
		dijkstra(i);
		long long xi=0,xii=0,xiii=0;
		for(register int j=2;j<=n;++j) pan[i][j]=(f[j]<=k);
		for(register int j=2;j<=n;++j) if(f[j]<=k&&i!=j&&vl[j]>xi) xi=vl[j],li[i]=j;
		for(register int j=2;j<=n;++j) if(f[j]<=k&&i!=j&&j!=li[i]&&vl[j]>xii) xii=vl[j],lii[i]=j;
		for(register int j=2;j<=n;++j) if(f[j]<=k&&i!=j&&j!=li[i]&&j!=lii[i]&&vl[j]>xiii) xiii=vl[j],liii[i]=j;
	}
	for(register int i=2;i<=n;++i){
		for(register int j=2;j<=n;++j){
			if(i==j||pan[i][j]==false) continue;
			int yi=0,yii=0;
			if(li[i]!=j&&ti[li[i]]==1) yi=li[i];
			else if(lii[i]!=j&&ti[lii[i]]==1) yi=lii[i];
			else if(liii[i]!=j&&ti[liii[i]]==1) yi=liii[i];
			if(yi==0) continue;
			if(li[j]!=i&&li[j]!=yi&&ti[li[j]]==1) yii=li[j];
			else if(lii[j]!=i&&lii[j]!=yi&&ti[lii[j]]==1) yii=lii[j];
			else if(liii[j]!=i&&liii[j]!=yi&&ti[liii[j]]==1) yii=liii[j];
			if(yii==0) continue;
			if(vl[i]+vl[j]+vl[yi]+vl[yii]>ans) ans=vl[i]+vl[j]+vl[yi]+vl[yii];
		}
	}
	cout<<ans;
	return 0;
}
2022/11/5 15:28
加载中...