65pts,用dijkstra+暴力,求优化
查看原帖
65pts,用dijkstra+暴力,求优化
476863
Henrry_Aq楼主2022/11/5 00:07
代码如下
#include<bits/stdc++.h>
using namespace std;
#define MAXN 2005 
#define MAXM 10005 
#define INF 2147483647
int n,m,K,cnt;
long long value[MAXN],ans=-1;
int head[MAXM],d[MAXN],road[MAXN][MAXN];
int visited[MAXN];
struct node{
	int from,to,v,next;
}edge[MAXM];
struct data{
	int dis,dz;	
};
struct mygreater{
	bool operator() (const data &x,const data &y) const{
		return x.dis>y.dis;
	}
};
void ins(int from,int to,int v){
	cnt++;
	node f={from,to,v,head[from]};
	edge[cnt]=f;
	head[from]=cnt;
}
void dijkstra(int s){
	priority_queue<data,vector<data>,mygreater >q;
	memset(visited,0,sizeof(visited));
	for(int i=1;i<=n;i++) d[i]=INF;
	d[s]=0;
	q.push((data){0,s});
	while(!q.empty()){
		data f=q.top();
		q.pop();
		if(visited[f.dz]) continue;
		visited[f.dz]=1;
		for(int i=head[f.dz];i!=0;i=edge[i].next){
			if(!visited[edge[i].to]&&d[edge[i].to]>d[edge[i].from]+edge[i].v){
				d[edge[i].to]=d[edge[i].from]+edge[i].v;
				q.push((data){d[edge[i].to],edge[i].to});
			}
		}
	}
	for(int i=1;i<=n;i++) road[s][i]=d[i]-1;
} 
int main(){
	scanf("%d%d%d",&n,&m,&K);
	for(int i=2;i<=n;i++) scanf("%lld",&value[i]);
	value[1]=0;
	for(int i=1;i<=m;i++){
		int from,to;
		scanf("%d%d",&from,&to);
		ins(from,to,1);
		ins(to,from,1);
	}
	for(int i=1;i<=n;i++) dijkstra(i);
	for(int i=2;i<=n;i++){
		long long sum=0;
		if(road[1][i]>K) continue;
		sum+=value[i];
		for(int j=2;j<=n;j++){
			if(road[i][j]>K||i==j) continue;
			sum+=value[j];
			for(int k=2;k<=n;k++){
				if(road[j][k]>K||k==j||k==i) continue;
				sum+=value[k];
				for(int l=2;l<=n;l++){
					if(road[k][l]>K||l==k||l==j||l==i||road[l][1]>K) continue;
					sum+=value[l];
					ans=max(ans,sum);
					//if(ans==sum) cout<<1<<" "<<i<<" "<<j<<" "<<k<<" "<<l<<" "<<ans<<endl;
					sum-=value[l];
				}
				sum-=value[k];
			}
			sum-=value[j];
		}
		sum-=value[i];
	}
	printf("%lld",ans);
	return 0;
}
2022/11/5 00:07
加载中...