求助P8817
  • 板块题目总版
  • 楼主sane1981
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/4/8 17:37
  • 上次更新2023/10/23 19:02:32
查看原帖
求助P8817
801978
sane1981楼主2023/4/8 17:37

跪求大佬调代码,不知道哪里有问题

P8817

code

#include<bits/stdc++.h>
#include<vector>
#include<queue>
using namespace std;
typedef pair<long long,int> PLI;
const int INF=1<<30;
const int N=2505;
int n,m,K,a,b;
vector <int> G[N];
vector <PLI> A[N];
int dis[N][N];
bool inq[N];
long long cost[N],ans;
bool cmp(PLI X,PLI Y){
	return X.first>Y.first;
}
void SPFA(int s){
	queue <int> Q;
	for(int i=1;i<=n;i++) dis[s][i]=INF,inq[i]=false;
	Q.push(s);
	dis[s][s]=0,inq[s]=true;
	while(!Q.empty()){
		int u=Q.front();Q.pop();
		inq[u]=false;
		for(int i=0;i<G[u].size();i++){
			int v=G[u][i];
			if(dis[s][v]>dis[s][u]+1){
				dis[s][v]=dis[s][u]+1;
				if(!inq[v]) Q.push(v),inq[v]=true;
			}
		}
	}
} 
int main(){
//	freopen("holiday3.in","r",stdin);
//	freopen("holiday_my.out","w",stdout); 
	scanf("%d%d%d",&n,&m,&K);
	for(int i=2;i<=n;i++) scanf("%lld",&cost[i]);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&a,&b);
		G[a].push_back(b);
		G[b].push_back(a);
	}
	for(int i=1;i<=n;i++) SPFA(i);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(dis[i][j]>K+1||i==j) dis[i][j]=INF;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)
			if(dis[i][j]!=INF&&i!=j) A[i].push_back(make_pair(cost[j],j));
		sort(A[i].begin(),A[i].end(),cmp);
	}
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
			if(i==j||dis[i][j]==INF) continue;	
			for(int r=0;r<3&&r<A[i].size();r++){
				int k=A[i][r].second;
				if(k==j||dis[k][1]==INF) continue;
				long long w1=A[i][r].first;
				for(int s=0;s<3&&s<A[j].size();s++){
					int l=A[j][s].second;
					if(l==i||l==k||dis[l][1]==INF) continue;
					long long w2=A[j][s].first;
//					printf("%d->%d->%d->%d = %lld \n",k,i,j,l,cost[i]+cost[j]+w1+w2);
					ans=max(ans,cost[i]+cost[j]+w1+w2);
				}
			}
		}
	}
	printf("%lld\n",ans);
	return 0;
}
2023/4/8 17:37
加载中...