只错了一个点,大佬们帮忙看看吧,玄关
查看原帖
只错了一个点,大佬们帮忙看看吧,玄关
508032
int08楼主2023/8/23 08:33

只错了民间数据 #7

#include<bits/stdc++.h>
#define maxn 10086
using namespace std;

struct edge {
  long long v, w;
};
struct node {
  long long dis, u;
  bool operator>(const node& a) const { return dis > a.dis; }
};

vector <edge> e[maxn];
long long dis[maxn][maxn], vis[maxn];
priority_queue<node, vector<node>, greater<node> > q;

void dijkstra(long long n, long long s) 
{
	memset(vis,0, sizeof(vis));
	for(long long i=1;i<=3000;i++) 
		dis[s][i]=999999999;
	dis[s][s] = 0;
	q.push({0, s});
	while(!q.empty())
	{
		long long u=q.top().u;
    	q.pop();
	    if(vis[u]) continue;
    	vis[u]=1;
   		for(auto ed :e[u]) 
		{
   		    long long v = ed.v, w = ed.w;
    	  	if (dis[s][v] > dis[s][u] + w) 
			{
   		  	 	dis[s][v] = dis[s][u] + w;
    	  	  	q.push({dis[s][v], v});
   	   		}
    	}
  	}
}
long long n,m,k,i,j,p[maxn],uu[maxn],vv[maxn],l,fi[5][maxn],fn[5][maxn],ans;
int main()
{
	cin>>n>>m>>k;
	for(i=2;i<=n;i++) cin>>p[i];
	for(i=1;i<=n;i++) fi[1][i]=fi[2][i]=fi[3][i]=-1;
	for(i=1;i<=m;i++)
	{
		cin>>uu[i]>>vv[i];
		e[uu[i]].push_back({vv[i],1});
		e[vv[i]].push_back({uu[i],1});
	}
	for(i=1;i<=n;i++)
		dijkstra(n,i);
	for(i=2;i<=n;i++)
	if(dis[1][i]<=k+1)
	{
		for(j=2;j<=n;j++)
		{
			if(j!=i&&dis[i][j]<=k+1)
			{
				if(p[i]>fi[1][j]){
					fi[3][j]=fi[2][j];fn[3][j]=fn[2][j];
					fi[2][j]=fi[1][j];fn[2][j]=fn[1][j];
					fi[1][j]=p[i];fn[1][j]=i;
					continue;
				}
				if(p[i]>fi[2][j]){
					fi[3][j]=fi[2][j];fn[3][j]=fn[2][j];
					fi[2][j]=p[i];fn[2][j]=i;
					continue;
				}
				if(p[i]>fi[3][j]){
					fi[3][j]=p[i];fn[3][j]=i;
				}
			}
		}
	}
	for(i=2;i<=n;i++)
		for(j=2;j<=n;j++)
		if(i!=j&&fi[1][i]!=-1&&fi[1][j]!=-1&&dis[i][j]<=k+1&&dis[i][j]!=0)
		{
			long long f=0;
			for(m=1;m<=3;m++)
				for(l=1;l<=3;l++)
				{
					if(fn[m][i]!=fn[l][j]&&fn[m][i]!=j&&i!=fn[l][j]&&fn[m][i]!=0&&fn[l][j]!=0)
					{
						f=max(f,fi[m][i]+fi[l][j]);
					}
				}
			ans=max(ans,f+p[i]+p[j]);
		}
	cout<<ans;
	return 0;
}
2023/8/23 08:33
加载中...