T1 70pts暴力
  • 板块学术版
  • 楼主Halo_world
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/10/29 20:31
  • 上次更新2023/10/27 05:04:53
查看原帖
T1 70pts暴力
584746
Halo_world楼主2022/10/29 20:31

I believe it's right!

#include<bits/stdc++.h>
#define int long long 
#define printlf(x) print(x),putchar('\n')
#define printsp(x) print(x),putchar(' ')
using namespace std;
inline int read(){
	int x=0;bool w=0;char c=getchar();
	while(!isdigit(c))	w|=c=='-',c=getchar();
	while(isdigit(c))	x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return w?-x:x;
}
inline void print(int x){
	if(x<0)	putchar('-'),x=-x;
	if(x>9)	print(x/10);
	putchar('0'+x%10);
}
const int N=2505,M=1e4+5,INF=INT_MAX;
int a[N],head[N],dis[N][N],vis[N],flag[N][N];
int n,m,k,tot,ans;
struct edge{
	int to,nxt,dis;
}Edge[M<<1];
struct node{
	int now,dis;
	bool operator <(const node &x) const{
		return x.dis<dis;
	}
};
inline void add(int u,int v,int w){
	Edge[++tot].to=v;
	Edge[tot].dis=w;
	Edge[tot].nxt=head[u];
	head[u]=tot;
}
inline void Dijkstra(int s){
	priority_queue<node> q;
	for(register int i=1;i<=n;++i)	dis[s][i]=INF;
	dis[s][s]=0;
	memset(vis,0,sizeof(vis));
	q.push((node){s,0});
	while(!q.empty()){
		int x=q.top().now;q.pop();
		if(vis[x])	continue;
		vis[x]=1;
		for(register int i=head[x];i;i=Edge[i].nxt){
			int v=Edge[i].to,w=Edge[i].dis;
			if(dis[s][x]+w<dis[s][v]){
				dis[s][v]=dis[s][x]+w;
				q.push((node){v,dis[s][v]});
			}
		}
	}
}
priority_queue<pair<int,int> > getmax[N];
#define Sec second
#define Fir first
vector<int> gop[N];
signed main(){
	freopen("holiday.in","r",stdin);
	freopen("holiday.out","w",stdout);
	n=read(),m=read(),k=read();
	for(register int i=2;i<=n;++i)	a[i]=read();
	for(register int i=1;i<=m;++i){
		int u=read(),v=read(),w=1;
		add(u,v,w),add(v,u,w);
	}
//	cout<<" add over\n";
	for(register int i=1;i<=n;++i){
		Dijkstra(i);
	}
//	for(register int i=1;i<=n;++i){
//		for(register int j=1;j<=n;++j)
//			cout<<dis[i][j]<<' ';cout<<"dis\n";
//	}
	for(register int i=1;i<=n;++i){
		for(register int j=1;j<=n;++j){
			if(i==j)	continue;
			if(dis[i][j]<=k+1){
//				cout<<i<<' '<<j<<" conect\n";
				flag[i][j]=1;
				gop[i].push_back(j);
			}
		}
	}
	for(register int i=2;i<=n;++i){
		for(register int j=2;j<=n;++j){
			if(flag[i][j] && flag[1][j])	
				getmax[i].push({a[j],j});
		}
	}
//	for(register int i=1;i<=n;++i){
//		for(register int j=1;j<=n;++j)
//			cout<<flag[i][j]<<' ';cout<<" flag\n";
//	}
	for(register int i=0;i<gop[1].size();++i){
		int fir=gop[1][i];
		for(register int j=0;j<gop[fir].size();++j){
			int sec=gop[fir][j];
			if(fir==sec)	continue;
			for(register int k=0;k<gop[sec].size();++k){
				int thi=gop[sec][k];
				if(fir==thi || sec==thi)	continue;
				int l=0;pair<int,int> o[3];
				while(!getmax[thi].empty() && (getmax[thi].top().Sec==fir || getmax[thi].top().Sec==sec || getmax[thi].top().Sec==thi))
					o[l++]=getmax[thi].top(),getmax[thi].pop();
				if(getmax[thi].empty()){
					for(register int u=0;u<l;++u)	getmax[thi].push(o[u]);
					continue;
				}
				int gm=getmax[thi].top().Fir;
				for(register int u=0;u<l;++u)	getmax[thi].push(o[u]);
				ans=max(ans,gm+a[fir]+a[sec]+a[thi]);
//				cout<<fir<<' '<<sec<<' '<<thi<<' '<<gm<<' '<<a[fir]<<' '<<a[sec]<<' '<<a[thi]<<' '<<ans<<endl;
			}
		}
	}
	print(ans);
	return 0;
}


2022/10/29 20:31
加载中...