请问我这份代码可以过吗,感觉没有问题
查看原帖
请问我这份代码可以过吗,感觉没有问题
431289
lalaouye楼主2022/10/29 20:33
#include<bits/stdc++.h>
using namespace std;

long long n,m,k,ans,sc[2555],dis[2555],vis[2505];
vector<int> v[2555],s[2555];
bool b[2505][2505],bb[2505][2505];
struct node{
	long long x,fa;
};
struct Nod{
	long long dis,diss,fa,ffa;
}zd[2505];
vector<node> to;
struct Node{
	long long x,dis,fa;
};
void bfs(int x){//将等到达的新建边 
	for(int i=1;i<=n;i++)vis[i]=0;
	vis[x]=1;
	queue<Node> q;
	Node t;t.x=x,t.dis=t.fa=-1;
	q.push(t);
	while(q.size()){
		t=q.front();
		q.pop();
		int now=t.x;
		for(int i=0;i<v[now].size();i++){
			int y=v[now][i];
			if(y==t.fa||vis[y])continue;
			vis[y]=1;
			if(t.dis+1<k){
				Node tmp;
				tmp.x=y;
				tmp.fa=now;
				tmp.dis=t.dis+1;
				q.push(tmp);
			}
			if(!b[x][y])
			s[x].push_back(y),b[x][y]=1;
		}
	}
}

int main(){
//	freopen("holiday.in","r",stdin);
//	freopen("holiday.out","w",stdout);
	scanf("%lld%lld%lld",&n,&m,&k);
	for(int i=2;i<=n;i++){
		scanf("%lld",&sc[i]);
	}
	for(int i=1;i<=m;i++){
		long long x,y;
		scanf("%lld%lld",&x,&y);
		v[x].push_back(y);
		v[y].push_back(x);
	}
	for(int i=1;i<=n;i++)bfs(i);//建新边 
	for(int i=0;i<s[1].size();i++){
		int x=s[1][i];//找与1相连的 
		for(int j=0;j<s[x].size();j++){
			int y=s[x][j];
			if(y==1)continue;
			if(sc[x]>zd[y].dis){
				zd[y].diss=zd[y].dis;
				zd[y].dis=sc[x];
				zd[y].ffa=zd[y].fa;
				zd[y].fa=x;
			}
			else if(sc[x]>zd[y].diss){
				zd[y].diss=sc[x]; 
				zd[y].ffa=x;
			}//保留最大值和次大值 
		}
	}
//	n
	for(int i=1;i<=n;i++){
		if(zd[i].dis){
			node t;
			t.x=i,t.fa=zd[i].fa;
			to.push_back(t);
		}
		if(zd[i].diss){
			node t;
			t.x=i,t.fa=zd[i].ffa;
			to.push_back(t);
		}//进入vector 
	}
	for(int i=0;i<to.size();i++){
		for(int j=0;j<to.size();j++){
			node t1=to[i];
			node t2=to[j];
			if(t1.x==t2.x||t1.fa==t2.fa||!b[t1.x][t2.x]||t2.x==t1.fa||t1.x==t2.fa)continue;
			ans=max(ans,sc[t1.fa]+sc[t2.fa]+sc[t1.x]+sc[t2.x]);
		//	枚举 
		}
	}
	cout<<ans;
	return 0;
} 
2022/10/29 20:33
加载中...