求助,为什么挂两个点啊
查看原帖
求助,为什么挂两个点啊
141577
yhc12345楼主2022/10/29 23:29
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define pb push_back
using namespace std;
typedef long long ll;
const int N=2505,M=1e5+10;
int n,m,k,cnt[N],dis[N][N];
bool vis[N];
ll w[N],ans;
int head[N],ne;
int qu[N],quhead,qutail;
struct edge {
	int v,nxt;
}e[M<<1];
void init() {
	memset(head,-1,sizeof(head));
	ne=0;
}
void add_edge(int u,int v) {
	e[ne].v=v;
	e[ne].nxt=head[u];
	head[u]=ne++;
}
inline void rd(int &x) {
	x=0;
	char c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9') {
		x=(x<<3)+(x<<1)+(c^'0');
		c=getchar();
	}
}
struct node {
	int id;
	ll w;
	node() {}
	node(int _id,ll _w) {
		id=_id;
		w=_w;
	}
	bool operator <(node b) const {
		return w>b.w;
	}
}p[N][10];
void bfs(int s) {
	memset(vis,false,sizeof(vis));
	quhead=qutail=1;
	qu[qutail++]=s;
	dis[s][s]=-1;
	vis[s]=true;
	while(quhead<qutail) {
		int h=qu[quhead];
		quhead++;
		for(int i=head[h];~i;i=e[i].nxt) {
			int v=e[i].v;
			if(!vis[v]) {
				vis[v]=true;
				qu[qutail++]=v;
				dis[s][v]=dis[s][h]+1;
			}
		}
	}
}
int main() {
	//freopen("holiday.in","r",stdin);
	//freopen("holiday.out","w",stdout);
	init();
	rd(n); rd(m); rd(k);
	for(int i=2;i<=n;i++) scanf("%lld",&w[i]);
	for(int i=1;i<=m;i++) {
		int u,v;
		rd(u); rd(v);
		add_edge(u,v);
		add_edge(v,u);
	}
	
	for(int i=1;i<=n;i++) bfs(i);
	
//	for(int i=1;i<=n;i++) {
//		for(int j=1;j<=n;j++) {
//			cout<<dis[i][j]<<' ';
//		}
//		cout<<endl;
//	}
	
	for(int i=2;i<=n;i++) {
		if(dis[1][i]<=k) {
			for(int j=2;j<=n;j++) {
				if(i!=j&&dis[i][j]<=k) {
					p[j][++cnt[j]]=node(i,w[i]);
					sort(p[j]+1,p[j]+cnt[j]+1);
					cnt[j]=min(cnt[j],5);
				}
			}
		}
	}
//	for(int i=1;i<=n;i++) {
//		for(int j=1;j<=5;j++) {
//			cout<<p[i][j].id<<' ';
//		}
//		cout<<endl;
//	}
	for(int i=2;i<=n;i++) {
		for(int j=i+1;j<=n;j++) {
			if(dis[i][j]<=k) {
				int g=(p[i][1].id==j?2:1);
				int h=(p[j][1].id==i?2:1);
				if(p[i][g].id==p[j][h].id) {
					int r=(p[j][h+1].id==i?h+2:h+1);
					if(p[i][g].id&&p[j][r].id) ans=max(ans,w[i]+w[j]+p[i][g].w+p[j][r].w);
					r=(p[i][g+1].id==j?g+2:g+1);
					if(p[i][r].id&&p[j][h].id) ans=max(ans,w[i]+w[j]+p[i][r].w+p[j][h].w);
				}
				else {
					if(p[i][g].id&&p[j][h].id) ans=max(ans,w[i]+w[j]+p[i][g].w+p[j][h].w);
				}
				//cout<<i<<' '<<j<<' '<<p[i][g].id<<' '<<p[j][h].id<<'\n';
			}
		}
	}
	
	printf("%lld",ans);
	return 0;
}

2022/10/29 23:29
加载中...